【发布时间】:2011-04-21 06:24:54
【问题描述】:
我正在使用 SQL Server,我需要将外键添加到已经存在的表中。
问题是作为外键的列在另一个表中已经有一些不一致的值(不会作为主键出现)。
我想知道,当我修改表并添加外键约束时,表中带有外键约束的行的值不一致会发生什么??
--尼拉杰
【问题讨论】:
标签: sql sql-server database sql-server-2005
我正在使用 SQL Server,我需要将外键添加到已经存在的表中。
问题是作为外键的列在另一个表中已经有一些不一致的值(不会作为主键出现)。
我想知道,当我修改表并添加外键约束时,表中带有外键约束的行的值不一致会发生什么??
--尼拉杰
【问题讨论】:
标签: sql sql-server database sql-server-2005
在这种情况下,这是您的决定。您可以使用 WITH NOCHECK 子句将此值保留在表中。但所有新插入的值都会被检查。
【讨论】:
WITH NOCHECK那么FK约束将不会被创建,因为子表中有僵尸行...
你会得到一个错误并且不会插入任何东西。
查找所有不一致的行(假设A和B是目标表,A.id是父键,B.fk_id是子表,外键,id):
SELECT B.fk_id
FROM B
LEFT JOIN A ON A.id = B.fk_id
WHERE A.id IS NULL
执行后,您将拥有所有引用“无处”的子行。因此,您要么需要删除它们,要么修改为指向现有行,要么将B.fk_id 设置为NULL(如果没有NOT NULL 约束)。
在该查询返回 0 行之后 - 您可以安全地创建外键约束,而无需任何魔术选项。
【讨论】:
LEFT JOIN 的不一致行并将其修复为正确的值。