2011-04-07 95 views
2

我想知道在SQL Server中使用外键的原因,因为我与同事之一进行了辩论。SQL Server中的外键

我有意见,当两个表通过外键连接时,当记录从父表中删除,那么从子表中删除相同的引用记录也应该删除。

说例如我有两个表,Table1和Table2。 Table1有一个id = 1的记录,而Table2有两个id = 1的记录。表2是一个子表,通过一个外键与Table1连接。现在,当我尝试从Table1中删除id = 1记录时,应该同时从Table2中删除id = 1(2条记录)。

他说这是错误的。如果是外键,我必须分别从两个表中删除记录。

谁是正确的?

回答

3

这两个答案都可以使用并且可以工作。

您的同事的版本会在您的应用程序(或您的DBA)上进行更多的责任删除:应用程序(或DBA)必须首先检查子行并删除它们,然后删除父行。这是有效的,并不会给你任何意想不到的惊喜。

如果你在你的外键约束(在几乎任何严肃的关系数据库系统中应该可能)上加上一个ON DELETE CASCADE选项,那么行为就是你描述它的方式 - 从商业角度来看这可能是有意义的(例如,删除订单中的所有订单商品),但在其他情况下,它可能完全没有任何意义(例如,如果您删除了订单编号1234,则通常不需要要删除所有商品该订单的订单项目可能会参考)。

所以有两种情况 - 在某些情况下都有意义,而在其他情况下则不那么重要。这根本不是一个简单的“或 - 或”/“正确与错误”的问题。

+0

好的答案,但并没有完全回答OP关于'在SQL Server中使用外键'的第一个问题。但我认为这会打击范围。 – 2011-04-07 18:38:31

+0

但是,如果我设置删除和更新为无操作的外键,当我尝试从父表中删除记录,然后我得到错误的子表中的外键冲突。 – Abbas 2011-04-07 19:01:20

+0

@abbas:是的 - 如果你设置“无动作”,那么它是**你的**首先删除子行的责任。 – 2011-04-07 20:20:38

-2

我相信你的朋友是正确的 - 引用表不会自动删除,因为你删除了一个有外键的表。但是,您可以设置触发器来执行此操作。

外键主要用于指示数据模型中的关系 - 它们还可以通过添加额外的内容来增强表之间的数据完整性,以便在输入数据时没有参考表中存在的相应键值时抛出错误。

+1

读到它,但他们可以,如果你有'上 – SQLMenace 2011-04-07 18:21:02

+0

这就是为什么我说,它不会自动做,但你可以添加触发器做级联delete' ... – roberttdev 2011-04-07 19:08:25

+0

你说触发器,级联删除不是一个触发器 – SQLMenace 2011-04-07 19:13:59

1

这取决于事物是如何定义的。你可以有一个cascading delete,或者让它被封锁(你必须首先删除那个,然后另一个)

1

你是对的。

如果启用级联删除,则在删除主键行时,外键行也将被删除。

1

您可以创建要在Cascade中删除的表格。当您添加外键约束时,您需要指定冲突

CONSTRAINT fk1 
FOREIGN KEY(col) REFERENCES parent(col) ON DELETE CASCADE, 

否则,是的,您必须先删除子项。