不了解Sql Server错误

时间:2011-01-12 01:40:43

标签: sql-server relational-database cascading-deletes

我有一个用户表(User),需要创建一个新表来跟踪哪些用户引用了其他用户。所以,基本上,我在同一个表中的行之间创建了多对多的关系。

所以我正在尝试使用UserId和UserReferredId列创建表UserReferrals。我将两列都设为复合主键。这两列都是链接到User.UserID的外键。

由于删除用户也应删除该关系,因此我将两个外键设置为级联删除。删除用户后,UserReferrals中的任何相关行也应删除。

但这给了我一个信息:

'User' table saved successfully 'UserReferrals' table Unable to create relationship 'FK_UserReferrals_User'. Introducing FOREIGN KEY constraint 'FK_UserReferrals_User' on table 'UserReferrals' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints. Could not create constraint. See previous errors.

我没有收到此错误。级联删除只删除带有外键的行,对吧?那怎么能导致“循环级联路径”?

感谢您的任何提示。

3 个答案:

答案 0 :(得分:1)

如果表(A)上的FK引用了表(B),而表(B)又与(A)有关系,或者在同一个表中引用了PK的FK,它可以引入一个场景它循环。有时这在逻辑上是不可能的 - 但在纯理论中,它可能在SQL引擎的眼中。

这是不可避免的。通常我们在SP中处理这些(在EF中我们可以映射到删除方法)。

答案 1 :(得分:0)

如果您允许级联删除,删除UserId出现在其他用户的UserReferredId字段中的人也会导致删除这些用户!我怀疑你想要的是将UserReferredId的值设置为null,如果与之绑定的User被删除。

有几种方法,从删除命令的表触发器到使用删除的存储过程。忽略触发器是邪恶的论点,人们可以创建类似的东西:

删除后在用户上创建触发器clearUserReferredIdOnUserDelete 如 更新用户设置UserReferredId = null其中UserReferredId in(从删除中选择userid)

这是未经测试但应该接近。

P

答案 2 :(得分:0)

在考虑了这个之后,我开始认为问题与循环级联路径没有多大关系,因为它可能与多个级联路径有关。

虽然我的连接表中的两个UserID总是不同,但没有什么能阻止它们相同。如果它们都引用了同一个用户,并且该用户被删除,则会有多个连接表的级联路径。