2012-04-13 60 views
2

我有一個數據庫經過幾年來從幾個不同的編碼器輸入的一些主要轉換。某些表通過引用列包含對其他數據的引用,但沒有外鍵約束。這意味着有些表可能包含死鏈接。將外鍵約束添加到現有列

我想添加外鍵約束到所有的參考列。如何確保在某些數據可能引用死鏈接時其他鏈接可能爲空,而其他鏈接可能爲空。

我想我需要說這樣的事情:

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

哈哈!謝謝!我會。 (你評論最後的elipses嚇倒我)。所以如果沒有問題就沒問題,但如果有問題我該怎麼辦?這是否意味着沒有辦法添加外鍵約束? – hofnarwillie 2012-04-13 12:34:32

+0

好的謝謝你的意見。希望沒有太多問題,因爲有29000個用戶,我需要將外鍵約束添加到大約40個表格中! – hofnarwillie 2012-04-13 12:38:38

回答

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 2013-04-10 15:34:11

0

使用LEFT JOIN。這將顯示NULL s的項目不能加入意味着參考被刪除。