【问题标题】:SQL Server update primary key that's also a foreign key in two tablesSQL Server 更新主键,这也是两个表中的外键
【发布时间】:2009-09-04 14:07:10
【问题描述】:

我需要更新记录的主键,但它也是另外两个表中的外键。而且我需要更新后的主键也反映在子表中。

这是我的查询和错误:

begin tran
update question set questionparent = 10000, questionid= 10005 where questionid = 11000;
错误 9/4/2009 10:04:49 AM 0:00:00.000 SQL Server 数据库错误:UPDATE 语句与 REFERENCE 约束“FK_GoalRequirement_Question”冲突。冲突发生在数据库“numgmttest”、表“dbo.GoalRequirement”、列“QuestionID”中。 14 0

我不记得该怎么做,所以这就是我在这里的原因。有什么帮助吗?

【问题讨论】:

  • 另一种选择:避免使用可更改的主键。改为使用 IDENTITY 作为主键。对需要唯一的列保持唯一约束。这可能超出您的控制范围,但它对我们很有用。我们的用户可以随意更改 ID,并且不会影响实际的主键。

标签: sql-server


【解决方案1】:

你的人际关系在使用

ON UPDATE CASCADE 

如果他们正在更改主表中的键,则会更新外键。

例如

ALTER TABLE Books 
ADD CONSTRAINT fk_author 
FOREIGN KEY (AuthorID) 
REFERENCES Authors (AuthorID) ON UPDATE CASCADE 

【讨论】:

  • 有什么方法可以不用看脚本就知道吗?我没有权限查看它。
  • 确定:BEGIN TRANSACTION; DELETE FROM ParentTable WHERE ID = ?; ROLLBACK; 如果您看到 FK 违规,则 FK 的更新受到限制。
  • 这应该是公认的答案。我觉得它最接近地解决了 OP 的问题,并且比目前接受的答案更好。
  • @van,为什么 DELETE 对 UPDATE CASCADE 有任何影响。我错过了什么吗?
  • @KirkWoll,我的评论是在一个较小的背景下,上面评论的答案:如何检查是否在数据库上强制执行 FK;它超出了回答问题的范围。所以:你是对的:一个与另一个无关。
【解决方案2】:

你可以:

  1. 暂时禁用强制 FK 约束(请参阅 herehere
  2. 更新您的 PK
  3. 更新您的 FK
  4. 启用反向执行 FK 约束

在事务中执行所有操作,并确保如果事务失败,您可以正确回滚它并仍然强制执行 FK 约束。

但是……你为什么需要改变一个PK?我希望这是一个很少执行的操作(遗留数据导入或类似的东西)。

【讨论】:

  • 在我的情况下,因为我必须合并来自第二个数据库实例的数据,因此在第一个数据库中获取高于范围的所有 ID 将使我能够从第二个数据库批量插入到第一个数据库中。
【解决方案3】:

如果您想以图形方式设置级联规则,请在 SQL Management Studio 上设置级联规则

  1. 在设计模式下打开表格
  2. 点击顶部工具栏中的关系按钮
  3. 选择所需的外键关系(一一)
  4. 右侧 - 展开插入或更新规范
  5. 将 UPDATE 规则更改为 - 级联

关闭并保存,完成!

(在 SQL 2008 上尝试过)

【讨论】:

    【解决方案4】:

    由于我不太有信心禁用 FK 约束,因此我也更喜欢:

    1. 将旧 PK 行与新 PK 行复制
    2. 更新 FK
    3. 删除旧PK行

    优点:过程中没有违反约束。

    【讨论】:

    【解决方案5】:

    转到每个子表的外键关系,并在插入和更新规范上将删除和更新规则更改为级联。

    【讨论】:

      【解决方案6】:
      • 使用相同的数据和不同的主键创建一个新行。
      • 更新所有子表。
      • 删除重复数据的行

      它已经完成了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多