2009-09-28 110 views
5

我希望主要是因爲我還不是宇宙的SQL主人,所以我有一個難題(至少對我來說)。基本上我有三個表:SQL Server中避免數據庫光標

表A,表B和表C.

表C具有FK(Foriegn密鑰)表B,其具有FK表A.(每個這些被許多到一)

我需要從表A中刪除一個條目,當然還要從表B和C中刪除它的所有相應條目。在過去,我使用了一個遊標來完成此操作,選擇了表B中的所有條目並循環遍歷每一個刪除表C中的所有相應的條目。現在這個工作 - 並一直工作正常,但我懷疑/希望有一個更好的方式來實現這種效果,而不使用遊標。所以這就是我的問題 - 我如何在不使用遊標的情況下做到這一點,或者可以做到這一點?

(請讓我知道如果我不清楚 - 我會試着解決這個問題)。

回答

11

聲明你FOREIGN KEY S作爲ON DELETE CASCADE

+3

@ OP-當表A中刪除引用記錄時,這將刪除表B和C中的所有記錄 – 2009-09-28 14:16:47

2

當您創建兩個表可以指定ON DELETE CASCADE的外鍵關係,當你在A.刪除記錄它會照顧這對你

8

你可以這樣做一對夫婦的方式...

CREATE TABLE TableB 
    (FKColumn INT, 
    CONSTRAINT MyFk FOREIGN KEY (FKColumn) 
     REFERENCES TableA(PKColumn) ON DELETE CASCADE) 
  • 你可以使用每個表中刪除觸發器刪除相關記錄。

CREATE TRIGGER cascade_triggerA 
    ON TableA 
    FOR DELETE 
AS 
BEGIN 

    DELETE TableB 
    FROM TableB JOIN DELETED ON TableB.FKColumn = DELETED.PKColumn 

END 

CREATE TRIGGER cascade_triggerB 
    ON TableB 
    FOR DELETE 
AS 
BEGIN 

    DELETE TableC 
    FROM TableC JOIN DELETED ON TableC.FKColumn = DELETED.PKColumn 

END 
  • 如果您使用MS SQL服務器,你也可以使用INSTEAD OF DELETE觸發器。在這種情況下,您只需在TableA上創建觸發器 - 並在觸發器中將所有邏輯從所有3個表中刪除記錄。

在上述任何情況下,您只需從表A中刪除記錄,並讓級聯和觸發器負責其餘部分。

5

已經給出的答案(級聯刪除和觸發器)非常好,但是您可能在這些不是選項的環境中工作。如果是這樣,下面是一個純粹的SQL解決方案。該示例僅關注DELETE語法。在現實世界中,您可能會將其封裝在一個事務中,並將其作爲存儲過程來實現。

-- 
DECLARE @Param_PK_TableA int 
SET  @Param_PK_TableA = 1500 


------------------------------- 
-- TABLE C -------------------- 
DELETE TableC 

FROM TableC 

    INNER JOIN TableB 
      ON TableB.TableB_ID = TableC.TableB_ID 

    INNER JOIN TableA 
      ON TableA.TableA_ID = TableB.TableA_ID 

WHERE 
    (TableA.TableA_ID = @Param_PK_TableA) 



------------------------------- 
-- TABLE B -------------------- 
DELETE TableB 

FROM TableB 

    INNER JOIN TableA 
      ON TableA.TableA_ID = TableB.TableA_ID 

WHERE 
    (TableA.TableA_ID = @Param_PK_TableA) 



------------------------------- 
-- TABLE A -------------------- 
DELETE TableA 

WHERE 
    (TableA.TableA_ID = @Param_PK_TableA)