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

时间:2012-07-09 15:32:21

标签: sql sql-server

我在我要更新的应用程序中遇到了这个标记为“错误”的代码。在测试数据库上运行它会产生循环引用错误:

  

引用关系将导致不允许循环引用(约束名称= descript_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
);

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

1 个答案:

答案 0 :(得分:7)

这不是严格的周期性 - 但有多个级联路径。所以你可以用两种方式级联删除项目中的一行:

1)描述 - >项目
2)描述 - >来源 - >项目

而且,由于这个原因,它是不允许的。

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

有关为什么不允许这样做的进一步阅读,请参阅this answer