DBAtlas · データベース運用アトラス

1785: Introducing FOREIGN KEY constraint may cause cycles or multiple cascade paths(FOREIGN KEY 制約により循環または複数のカスケードパスが生じる可能性)

SQL Server

意味

追加しようとしている外部キーが、カスケード (ON DELETE/UPDATE CASCADE) 操作において循環、または同じテーブルへの複数のカスケード削除/更新経路を生じる可能性がある。あいまいなカスケード動作を避けるため、SQL Server はこれを拒否する。

原因

カスケード動作付きの FK がテーブル間の循環参照 (A->B->A) または 1 つのテーブルへの複数のカスケード経路を作る。あいまいなカスケード順序と無限ループを防ぐため、SQL Server はこれを禁止する。

対処方法

外部キーを ON DELETE NO ACTION / ON UPDATE NO ACTION (カスケードなし) で定義する: ALTER TABLE child ADD CONSTRAINT fk ... FOREIGN KEY (...) REFERENCES parent(...) ON DELETE NO ACTION; 必要なカスケード削除は INSTEAD OF DELETE トリガーで実装する: トリガーで先に子行を削除し、次に親行を削除する (例: DELETE c FROM child c JOIN deleted d ON c.parent_id = d.id; DELETE e FROM parent e JOIN deleted d ON e.id = d.id;)。AFTER DELETE トリガーでは機能しない。FK チェックがトリガーより前に実行されるため、削除はエラー 547 で拒否される。データモデルの循環依存を見直す。

DBAtlas で開く →

同じデータベースの他の項目