2009-09-02 15 views

回答

4

你可以做一個命令兩個語句:

DELETE FROM ChildTable; DELETE FROM ParentTable;

但是這是兩個語句的效果。

您可以在刪除父記錄的ChildTable上放置觸發器。

既不符合您的標準。

1

應該是在一個交易 - 這可能是效率較低,但很多數據的完整性更好

BEGIN TRAN 
DELETE FROM ChildTable WHERE safetycatch=0 
DELETE FROM ParentTable WHERE safetycatch=0 
COMMIT TRAN 

編輯 - 如果你真的想使用只有一個語句,那麼你可以如創建一個存儲過程

CREATE PROCEDURE DeleteBoth AS 
    BEGIN TRAN 
    DELETE FROM ChildTable WHERE safetycatch=0 
    DELETE FROM ParentTable WHERE safetycatch=0 
    --ERROR HANDLING IF STUFF GOES WRONG THEN ROLLBACK TRAN 
    COMMIT TRAN 
GO 

那麼您可以在一個線路從此與

EXEC DeleteBoth 

隨着高速緩存的執行計劃,我想比起級聯刪除的性能差異可以忽略不計運行它那是相當多什麼反正在幕後。

+2

這些示例應該謹慎使用。從ChildTable中刪除並從ParentTable中刪除將刪除這些表上的所有條目。請記住在查詢中引用WHERE語句以避免此問題。 – Chris 2009-09-02 16:44:28

+1

永遠不要寫一個具有commit tran的proc,而沒有辦法來捕獲錯誤並在有回退的情況下回滾。克里斯是對的,把刪除的例子放在沒有條款的地方是非常危險的。 – HLGEM 2009-09-02 19:07:31

+0

我會希望這是顯而易見的...添加了條款和錯誤處理僞代碼。現在停止低調我! – wefwfwefwe 2009-09-03 07:17:23

0

日產番提到,觸發器會做到這一點。正如wefwfwefwe所建議的那樣,如果事務必須全部或全無,請使用事務。

取決於你是多麼絕望,你可以在一個過於複雜的方式與向數據庫發出一個語句做結合兩種:

  1. 建立在連接表的視圖。
  2. 添加INSTEAD OF觸發器就可以了,編碼從兩個表刪除相應的行。沒有真正推薦,但你可以做到。
1

是的,但僅限於定義外鍵關係並使用ON DELETE CASCADE選項。

一切將需要兩個語句,即使陳述碰巧在同一個事務。

0

通常沒有設置級聯刪除(通常與阻塞和鎖定有關)是一個很好的理由。由於它們沒有設置,所以你需要自己爲所有子表和父表編寫單獨的刪除語句。我建議最好的方法是在存儲過程中使用事務,因爲如果您關心數據的完整性,您不想執行部分刪除操作。確保有錯誤陷印和回滾。

相關問題