Sql 为什么这是一个周期性外键约束?

Sql 为什么这是一个周期性外键约束?,sql,sql-server,Sql,Sql Server,我在一个要更新的应用程序中发现了这个代码,标记为“error”。在测试数据库上运行它会出现周期性引用错误: 引用关系将导致不允许的循环引用(约束名称=descriptions_fk_2) 我对约束进行了命名,以查看是哪个约束导致了问题 CREATE TABLE items ( id INT NOT NULL UNIQUE IDENTITY, name NCHAR(100) NOT NULL UNIQUE, PRIMARY KEY (id) ); CREATE TABLE sources ( i

我在一个要更新的应用程序中发现了这个代码,标记为“error”。在测试数据库上运行它会出现周期性引用错误:

引用关系将导致不允许的循环引用(约束名称=descriptions_fk_2)

我对约束进行了命名,以查看是哪个约束导致了问题

CREATE TABLE items (
id INT NOT NULL UNIQUE IDENTITY,
name NCHAR(100) NOT NULL UNIQUE,
PRIMARY KEY (id)
);

CREATE TABLE sources (
id INT NOT NULL UNIQUE IDENTITY,
item_id INT NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (item_id)
REFERENCES items(id) ON UPDATE NO ACTION ON DELETE CASCADE
);

CREATE TABLE descriptions (
id INT NOT NULL UNIQUE IDENTITY,
item_id INT NOT NULL, 
source_id INT NOT NULL,
PRIMARY KEY (id),
CONSTRAINT descriptions_fk_1 FOREIGN KEY (item_id)
REFERENCES items(id) ON UPDATE NO ACTION ON DELETE CASCADE,
CONSTRAINT descriptions_fk_2 FOREIGN KEY (source_id)
REFERENCES sources(id) ON UPDATE NO ACTION ON DELETE CASCADE
);

为什么这是一个周期性的参考?
说明
表链接到两个单独的表,但没有一个表链接回
说明

它不是严格的循环-但有多个级联路径。因此,您可以通过两种方式级联删除行:

1) 说明->项目
2) 说明->来源->项目

因此,这是不允许的

我认为这是一个性能问题,因为PostGres会允许这样的循环,并且会解决它,但是在这种情况下删除可能会非常慢


要进一步了解为什么不允许,请参阅。

这不是一个好的设计。由于一个源已经被引用到一个项目,你不应该在表
descriptions
中添加
item\u id
,使用
source\u id
@Lamak我也注意到了这一点。尽管如此,代码还是让我感到好奇。这很可能是多个级联路径的问题。请参阅此SO帖子:@JimMcKeon谢谢您的链接。这就很好地解释了。也许在你的帖子中添加一个链接,因为它很好地解释了一切?我已经添加了链接,但是,我不得不说,我不认为这是一个大问题。编写遍历循环树并将其添加到“要删除的行”列表的代码相当简单。只有当不同的级联路径具有不同的操作时,问题才会出现,因为这将导致冲突。这就是为什么我说我认为这是一个性能问题,因为在一个非常大的桌子上走那棵树会很快变得非常昂贵。