将外键约束添加到现有列

时间:2012-04-13 12:20:32

标签: sql-server tsql foreign-keys foreign-key-relationship

我有一个数据库,经过几年来从几个不同编码人员的输入经历了一些重大转变。某些表包含通过引用列对其他数据的引用,但没有外键约束。这意味着有些表可能包含死链接。

我想将外键约束添加到所有引用列。当某些数据可能引用死链接而其他数据实际上可能为空时,我怎样才能确保这种方法成功。

我想我需要这样说:

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

请告诉我这是否准确以及是否有任何隐藏的陷阱?

提前致谢

2 个答案:

答案 0 :(得分:6)

试试吧!! 如果出现问题 - 引用表中不存在的值 - SQL Server会告诉你,没有什么不好的事情发生 - 相信我! :-)

说真的:如果有问题,例如Users中具有无效Person_ID值的行,然后SQL Server 创建FK约束 - 就这么简单。

在这种情况下,如果Users表中的条目没有引用Person_ID表中的有效Person,则需要先修复这些条目。将它们设置为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)

答案 1 :(得分:0)

使用LEFT JOIN。这将显示NULL关于无法连接的项目,意味着删除了引用。