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 で拒否される。データモデルの循環依存を見直す。
同じデータベースの他の項目
- 1101Could not allocate a new page because of insufficient disk space in filegroup(ファイルグループのディスク容量不足により新しいページを割り当てられない)
- 3729Cannot DROP because it is being referenced by object(オブジェクトから参照されているため DROP できない)
- 3961Snapshot isolation transaction failed because the object was modified by a DDL statement(DDL 文でオブジェクトが変更されたためスナップショット分離トランザクションが失敗)
- 9421XML parsing: illegal xml character(XML 解析: 無効な XML 文字)
- 15151Cannot find the object/principal because it does not exist or you do not have permission(オブジェクト/プリンシパルが存在しないか権限がないため見つからない)
- 4834You do not have permission to use the bulk load statement(一括読込み文を使用する権限がない)
- 10928Resource limit for the database has been reached (Azure SQL)(データベースのリソース上限に到達)