1. ホーム
  2. sql

[解決済み] 外部キー制約は、サイクルまたは複数のカスケードパスの原因となる可能性がありますか?

2022-04-21 12:43:55

質問

テーブルに制約を追加しようとすると、問題が発生します。エラーが発生します。

Employee' テーブルに FOREIGN KEY 制約 'FK74988DB24B3C886' を導入すると、サイクルまたは複数のカスケード・パスが発生する可能性があります。ON DELETE NO ACTION または ON UPDATE NO ACTION を指定するか、他の FOREIGN KEY 制約を変更します。

私の制約は Code テーブルと employee テーブルを作成します。その Code テーブルには Id , Name , FriendlyName , Type であり Value . また employee には、コードを参照するフィールドがいくつかあり、コードの種類ごとに参照できるようになっています。

参照されているコードが削除された場合、フィールドをnullに設定する必要があります。

どうすればいいのでしょうか?

どのように解決するのですか?

SQL Serverはカスケード経路を単純に数え、実際にサイクルが存在するかどうかを調べるのではなく、最悪の事態を想定し、参照アクションの作成(CASCADE)を拒否します:参照アクションなしで制約を作成することができますし、そうするべきです。もし、設計を変更できない(または、変更することで妥協してしまう)場合、最後の手段としてトリガーを使用することを検討すべきです。

参考までに、カスケードパスの解決は複雑な問題です。他のSQL製品では、この問題を無視してサイクルを作成することができますが、その場合、どちらが最後に値を上書きするかを競うことになり、おそらく設計者の無知を招くことになります(例えば、ACE/Jetがこれにあたります)。SQL製品の中には、単純なケースを解決しようとするものがあることは理解しています。事実、SQL Serverは試行錯誤もせず、複数のパスを禁止することで超安全を期していますし、少なくともその旨は伝えています。

マイクロソフト自身 アドバイス は、FK制約の代わりにトリガーを使用します。