在SQL Server中添加外键约束存在问题?

3

我正在使用SQL Server,需要向已有的表中添加一个外键。

问题在于作为外键的列在另一张表中已经存在一些不一致的值(这些值不是主键)。

我想知道,当我修改表并添加外键约束时,具有不一致值的表行会发生什么?

-- Neeraj

2个回答

2
在这种情况下,这是您的决定。您可以使用WITH NOCHECK子句将这些值保留在表中。但是所有新插入的值都将被检查。

1
如果您不指定 WITH NOCHECK,则由于子表中存在僵尸行,FK 约束将不会被创建... - marc_s
NO CHECK 究竟是做什么用的? - Neeraj
可以在创建外键之前使用无效数据创建外键。换句话说,将创建FK,但不会进行任何现有数据检查。当您插入新数据时,它将被检查。 - Dalex
这也意味着每当更新传统行时,除非修复外,否则更新将失败。 - Martin Smith

1

你会收到一个错误并且没有任何数据被插入。

要查找所有不一致的行(假设AB是目标表,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行之后,您可以安全地创建外键约束,而不需要任何神奇的选项。


@Neeraj:修复数据使其一致,并创建约束。否则使用约束毫无意义。 - zerkms
@zerkms:好的...但是如果我不删除那些特定的键,我会面临什么问题?当我修改表时,我指的是像行自动消失因为它们具有不一致的外键或任何与数据丢失相关的问题。 - Neeraj
@Neeraj:从我的角度来看,不需要。您可以使用微不足道的“LEFT JOIN”选择所有不一致的行,并将其修复为正确的值。 - zerkms
@zerkms:我可能明白你的意思了。你能不能指点我一些教程,教我如何使用连接来删除这样的数据?(也许你已经猜到了,我是个新手) - Neeraj
@Neeraj:我更新了我的答案,加入了查询和一些解释。 - zerkms
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接