2009-11-12 79 views
1

我有2個表:survey (id(PK), name)survey_to_topic (survey_id(PK,FK,not null), topic_id(PK,FK,not null))。當我嘗試從調查表中刪除,我得到異常:在SQL Server中觸發前

「DELETE語句衝突與 的REFERENCE約束 ‘FK_survey _TO _topic _survey’的 衝突發生於數據庫 ‘MyDatabase的’,表 「dbo.survey _to _topic」,列 'survey _id'。「

因此,要首先得到沒有錯誤,我必須從表survey_to_topic刪除記錄,然後從表調查。我認爲在桌面調查之前觸發前最好,但我找不到任何有關這方面的信息。在PL/SQL之前有很多關於觸發器的文章,但我使用SQL Server。

回答

6

您可以將ON DELETE CASCADE添加到兩個表之間的關係中,並且survey_to_topic表中的記錄將自動刪除。

http://msdn.microsoft.com/en-us/library/aa933119(SQL.80).aspx

+0

是的,絕對是更容易的解決方案 – 2009-11-12 10:33:24

+0

謝謝,這是工作。 – Kate 2009-11-12 10:35:30

+0

你能接受答案嗎? :) – 2009-11-12 10:51:07

1

您可以使用ON DELETE CASCADE。這被添加到包含FK的表格中。

參見示例here

+0

謝謝你的問題。 – Kate 2009-11-12 10:37:04

1

正如Alex Deem和旁觀者已經提到的那樣 - 您應該在您的外鍵關係上使用ON DELETE CASCADE - 爲您自動處理此場景。

SQL Server不知道BEFORE(操作)的概念TRIGGERs - SQL Server具有AFTER觸發器或INSTEAD OF觸發器。有關某些背景信息,請參閱Introduction to triggers文章。

但ON DELETE CASCADE絕對是最簡單的方法。

0

正如其他人在這裏提到的,ON DELETE CASCADE是一種方式 - 只要您意識到後果;有一個原因爲什麼ON DELETE NO ACTION(引發錯誤)是默認值。換句話說,您應該計劃您的刪除策略 - 通過使用ON DELETE CASCADE非常容易從多個表中清除行。