【问题标题】:Issues with adding foreign key constraint in SQL Server?在 SQL Server 中添加外键约束的问题?
【发布时间】:2011-04-21 06:24:54
【问题描述】:

我正在使用 SQL Server,我需要将外键添加到已经存在的表中。

问题是作为外键的列在另一个表中已经有一些不一致的值(不会作为主键出现)。

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

--尼拉杰

【问题讨论】:

    标签: sql sql-server database sql-server-2005


    【解决方案1】:

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

    【讨论】:

    • 或者如果你不指定WITH NOCHECK那么FK约束将不会被创建,因为子表中有僵尸行...
    • NO CHECK 有什么作用??
    • 在你创建这个之前,可以用无效数据创建外键。换句话说,FK 将被创建,但不会检查现有数据。当你插入新数据时,它会被检查.
    • 这也意味着每当更新旧行时,除非 FK 已修复,否则更新将失败。
    【解决方案2】:

    你会得到一个错误并且不会插入任何东西。

    查找所有不一致的行(假设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 行之后 - 您可以安全地创建外键约束,而无需任何魔术选项。

    【讨论】:

    • @Neeraj:将数据修复为一致并创建约束。否则使用约束是毫无意义的。
    • @zerkms: 好的.. 但是如果我不删除那些特定的键,我会面临什么问题,当我改变表格时,我正在谈论诸如行消失之类的问题,因为他们有不一致的外键,或与数据丢失相关的任何问题。
    • @Neeraj:直到你让你的数据保持一致——创建外键约束是没有意义的。因为数据不可信。
    • @zerkms : 数据现在不一致,但是我们已经改变了服务层,这样,以后如果添加了不一致的外键,那么就会有一个类似的主键添加到所需的表中,包含必要的数据。并且随着该表的更新频率,表不会超过一天的时间就会有一致的数据。但是要做到这一点,首先我们需要添加这个约束顺其自然吧。希望能解决初始数据不一致的问题?
    • @Neeraj:从我的角度来看 - 不是。您可以选择所有带有琐碎 LEFT JOIN 的不一致行并将其修复为正确的值。
    猜你喜欢
    • 2014-11-17
    • 2017-06-17
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多