2

私は、いくつかの異なるコーダーからの入力を受けて、数年にわたっていくつかの大きな変革を遂げたデータベースを持っています。一部のテーブルには、参照列を介した他のデータへの参照が含まれていますが、外部キー制約はありません。無効なリンクを含む可能性のあるテーブルがいくつかあることを意味します。

すべての参照列に外部キー制約を追加したいと考えています。一部のデータがデッドリンクを参照している可能性があり、他のデータが実際にnullである可能性がある場合、これが成功することを確認するにはどうすればよいですか.

次のように言う必要があると思います。

ALTER TABLE dbo.Users ADD CONSTRAINT FK_Users_Persons FOREIGN KEY
(
    Person_ID --In some cases Person_ID will be null
) REFERENCES dbo.People
(
    Person_ID
) ON UPDATE  NO ACTION 
ON DELETE  NO ACTION 
NOT FOR REPLICATION

GO
ALTER TABLE dbo.Users
    NOCHECK CONSTRAINT FK_Users_Persons
GO
COMMIT

これが正確かどうか、また隠れた落とし穴があるかどうか教えてください。

前もって感謝します

4

2 に答える 2

6

やってみなよ!!問題が発生した場合 (参照先のテーブルに値が存在しない場合)、SQL Server が通知し、悪いことは何も起こりません。信頼してください! :-)

Users真剣に:無効な値を持つ行な​​どの問題があるPerson_ID場合、SQL Server はFK 制約を作成しません- それと同じくらい簡単です。

その場合、テーブル内Usersの有効なエントリを参照していないエントリがテーブル内にある場合は、最初にこれらを修正する必要があります。それらを(参照している人物がわからない場合)に設定するか、有効に設定してから、FK制約を再度追加してみてください。Person_IDPersonNULLPerson_ID

次のようなクエリで FK 制約を適用する前に、これらのエントリを見つけることもできます。

 SELECT (columns)
 FROM dbo.Users
 WHERE Person_ID IS NOT NULL 
 AND Person_ID NOT IN (SELECT DISTINCT Person_ID FROM dbo.Person)
于 2012-04-13T12:36:50.887 に答える
0

を使用しLEFT JOINます。これはNULL、参照が削除されたことを意味する結合できない項目に s を表示します。

于 2013-08-02T13:39:45.510 に答える