6

更新するアプリケーションで、「エラー」とマークされたこのコードに出くわしました。テストデータベースで実行すると、周期的な参照エラーが発生します。

参照関係は、許可されていない循環参照になります(制約名= description_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
);

なぜこれが循環参照なのですか?テーブルは2つの別々のdescriptionsテーブルにリンクされていますが、いずれもにリンクしていませんdescriptions

4

1 に答える 1

7

厳密には周期的ではありませんが、複数のカスケード パスがあります。したがって、次の 2 つの方法でアイテムの行をカスケード削除できます。

1) 説明 -> 項目
2) 説明 -> ソース -> 項目

そして、その理由で、それは許可されていません。

PostGresはそのようなサイクルを許可し、それをうまく処理するため、パフォーマンスの問題だと思いますが、そのような状況での削除は非常に遅くなる可能性があります.

許可されていない理由について詳しくは、この回答を参照してください。

于 2012-07-09T15:38:42.387 に答える