0

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

所以我正在尝试使用 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.

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

感谢您的任何提示。

4

3 回答 3

1

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

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

于 2011-01-12T01:44:01.577 回答
0

考虑到这一点后,我开始认为这个问题与循环级联路径的关系不大,而可能与多个级联路径有关。

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

于 2011-01-12T04:27:37.460 回答
0

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

有多种方法,从删除命令上的表触发器到使用存储过程进行删除。忽略触发器是邪恶的论点,可以创建如下内容:

删除后在用户上创建触发器 clearUserReferredIdOnUserDelete 作为更新用户设置 UserReferredId = null where UserReferredId in (select userid from deleted)

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

于 2011-01-12T01:49:21.863 回答