[解決済み] 外部キー制約は、サイクルまたは複数のカスケードパスの原因となる可能性がありますか?
質問
テーブルに制約を追加しようとすると、問題が発生します。エラーが発生します。
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制約の代わりにトリガーを使用します。
関連
-
[解決済み] FOREIGN KEY制約で参照されているため、テーブルを切り捨てることができないのですか?
-
ERROR 1136 (21S01) を解決してください。列の数が Mysql の行 1 の値の数と一致しません。
-
[解決済み] ストアドプロシージャ 'dbo.aspnet_CheckSchemaVersion' が見つかりませんでした。
-
[解決済み] LINQでInclude()は何をするのですか?
-
[解決済み] SQL Serverで実行中の合計を計算する
-
[解決済み] JOINとINNER JOINの違いについて
-
[解決済み] SQL Serverでレコードを削除した後、IDシードをリセットする。
-
[解決済み] SQL JOIN - WHERE句とON句の比較
-
[解決済み] Count()で条件を指定することは可能ですか?
-
[解決済み] 外部キーは自動的にインデックスを作成しますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
ERROR 1136 (21S01) を解決してください。列の数が Mysql の行 1 の値の数と一致しません。
-
[解決済み] ストアドプロシージャ 'dbo.aspnet_CheckSchemaVersion' が見つかりませんでした。
-
[解決済み] Oracle Trigger ORA-04098: トリガーが無効で、再バリデーションに失敗しました。
-
[解決済み] 各GROUP BYグループの最初の行を選択しますか?
-
[解決済み] INNER JOIN ON vs WHERE句
-
[解決済み] SQL Server における DateTime2 と DateTime の比較
-
[解決済み] SQLのインデックスとは何ですか?
-
[解決済み] "ON UPDATE CASCADE "を使用する場合について
-
[解決済み] T-SQL文の接頭辞Nの意味と使うべきタイミングは?
-
[解決済み] SQL/mysql - Select distinct/UNIQUE but return all column?