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

请让我知道这是否准确以及是否有任何隐藏的陷阱?

提前致谢

4

2 回答 2

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)
于 2012-04-13T12:36:50.887 回答
0

使用LEFT JOIN. 这将NULL在无法加入的项目上显示 s,这意味着引用已被删除。

于 2013-08-02T13:39:45.510 回答