2009-11-12 49 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非常容易从多个表中清除行。