2011-04-21 10 views
3

SQL Serverを使用しており、既存のテーブルに外部キーを追加する必要があります。SQL Serverで外部キー制約を追加する際の問題はありますか?

問題は、外部キーとして動作する列が、別のテーブルの(一次キーとして発生しない)矛盾した値を既に持っていることです。

テーブルを変更して外部キー制約を追加すると、一貫性のない値を持つ外部キー制約を持つテーブルの行はどうなりますか?

--Neeraj

答えて

2

あなたの決定です。 WITH NOCHECK句を使用して、この値を表に残すことができます。しかし、新しい挿入されたすべての値がチェックされます。

+1

または 'WITH NOCHECK'を指定しないと、子テーブルにゾンビの行が存在するため、FK制約は作成されません。 –

+0

NO CHECKはどのようなexacltyを実行しますか? – Neeraj

+0

これを作成する前に、データを無効にして外部キーを作成することができます。つまり、FKは作成されますが、既存のデータチェックは行われません。新しいデータを挿入すると、チェックされます。 – Dalex

1

あなたはエラーになりますし、何も挿入されません。

すべての一貫性のない行(ABは、ターゲット表していると仮定し、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行が返された後、魔法のオプションなしで外部キー制約を安全に作成できます。

+0

不整合なデータを持つ行が既にそこに存在しています。 – Neeraj

+0

@Neeraj:一貫性のあるデータを修正し、制約を作成します。さもなければ、制約を全く使用することは無意味です。 – zerkms

+0

@zerkms:ok ..しかし、私はこれらの特定のキーを削除しないでください。テーブルを変更すると、どのような問題に直面する可能性がありますか、私は一貫性のない外部キーを持っている行や、データ損失に関連する問題 – Neeraj

関連する問題