SQL Serverを使用しており、既存のテーブルに外部キーを追加する必要があります。SQL Serverで外部キー制約を追加する際の問題はありますか?
問題は、外部キーとして動作する列が、別のテーブルの(一次キーとして発生しない)矛盾した値を既に持っていることです。
テーブルを変更して外部キー制約を追加すると、一貫性のない値を持つ外部キー制約を持つテーブルの行はどうなりますか?
--Neeraj
SQL Serverを使用しており、既存のテーブルに外部キーを追加する必要があります。SQL Serverで外部キー制約を追加する際の問題はありますか?
問題は、外部キーとして動作する列が、別のテーブルの(一次キーとして発生しない)矛盾した値を既に持っていることです。
テーブルを変更して外部キー制約を追加すると、一貫性のない値を持つ外部キー制約を持つテーブルの行はどうなりますか?
--Neeraj
あなたの決定です。 WITH NOCHECK句を使用して、この値を表に残すことができます。しかし、新しい挿入されたすべての値がチェックされます。
あなたはエラーになりますし、何も挿入されません。
すべての一貫性のない行(A
とB
は、ターゲット表していると仮定し、A.id
が親キーであるとB.fk_id
子、外部キー、IDです)を見つけるには:
SELECT B.fk_id
FROM B
LEFT JOIN A ON A.id = B.fk_id
WHERE A.id IS NULL
それを実行した後、あなた'LL 「どこにも」を参照するすべての子行を持ちます。したがって、それらを削除するか、既存の行を指すように変更するか、または制約がない場合はB.fk_id
からNULL
に設定する必要があります。
このクエリで0行が返された後、魔法のオプションなしで外部キー制約を安全に作成できます。
または 'WITH NOCHECK'を指定しないと、子テーブルにゾンビの行が存在するため、FK制約は作成されません。 –
NO CHECKはどのようなexacltyを実行しますか? – Neeraj
これを作成する前に、データを無効にして外部キーを作成することができます。つまり、FKは作成されますが、既存のデータチェックは行われません。新しいデータを挿入すると、チェックされます。 – Dalex