将外键约束添加到现有列

hof*_*lie 2 t-sql sql-server 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
Run Code Online (Sandbox Code Playgroud)

如果这是准确的,如果有任何隐藏的陷阱,请告诉我?

提前致谢

mar*_*c_s 6

就试一试吧!!如果存在问题 - 引用表中不存在的值 - SQL Server会告诉您,并且不会发生任何不良事件 - 请相信我!:-)

严重的是:如果存在问题,例如行中的行Users具有无效Person_ID值,则SQL Server将不会创建FK约束 - 就这么简单.

在这种情况下,如果你有在条目Users表中没有引用一个有效Person_IDPerson表-你将需要修复这些第一.将它们设置为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)
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案和感谢查询显示如何识别错误的引用. (2认同)