6

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

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

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

4

1 回答 1

7

它不是严格周期性的——但有多个级联路径。因此,您可以通过两种方式级联删除项目中的一行:

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

并且,出于这个原因,它是不允许的。

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

有关为什么不允许它的进一步阅读,请参阅此答案

于 2012-07-09T15:38:42.387 回答