2012-04-13 15 views
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 

これも正確であれば任意の隠された落とし穴がある場合は私に知らせてください!事前に

おかげ

+0

ハハ!ありがとう!します。 (あなたのコメントの終わりの逃げ場は私を怖がらせる)。問題がなければ問題ありませんが、問題があればどうしますか?これは、外部キー制約を追加する方法がないことを意味しますか? – hofnarwillie

+0

入力していただきありがとうございます。うまくいけば、29000ユーザーがいるのであまりにも多くの問題はないと私は約40テーブルに外部キーの制約を追加する必要があります! – hofnarwillie

答えて

6

ちょうどそれを試してみてください!!問題がある場合 - 参照されたテーブルに存在しない値 - SQL Serverから通知され、何も起こりません - 私を信頼してください! :-)

真剣に:問題がある場合、 Usersの行が無効なPerson_IDの値を持つ場合、SQL Serverはではなく、というFK制約を作成します。

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

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

SELECT (columns) 
FROM dbo.Users 
WHERE Person_ID IS NOT NULL 
AND Person_ID NOT IN (SELECT DISTINCT Person_ID FROM dbo.Person) 
+2

誤った参照を特定する方法を示す質問に対する素晴らしい回答とありがとう。 – jr3

0

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