我正在使用SQL Server,需要向已有的表中添加一个外键。
问题在于作为外键的列在另一张表中已经存在一些不一致的值(这些值不是主键)。
我想知道,当我修改表并添加外键约束时,具有不一致值的表行会发生什么?
-- Neeraj
我正在使用SQL Server,需要向已有的表中添加一个外键。
问题在于作为外键的列在另一张表中已经存在一些不一致的值(这些值不是主键)。
我想知道,当我修改表并添加外键约束时,具有不一致值的表行会发生什么?
-- Neeraj
你会收到一个错误并且没有任何数据被插入。
要查找所有不一致的行(假设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行之后,您可以安全地创建外键约束,而不需要任何神奇的选项。
WITH NOCHECK
,则由于子表中存在僵尸行,FK 约束将不会被创建... - marc_s