【问题标题】:how to update a primary key if it is also the foreign key to another table?如果主键也是另一个表的外键,如何更新主键?
【发布时间】:2012-01-30 04:44:46
【问题描述】:

我有一个表 tableA,其中有一列 myID。 myID 是 tableA 的主键和 tableB 的外键。

当我尝试更新 tableA 中特定记录的 myID 时:

update tableA
set myID = 123456
where myID= 999999

我收到了这个错误:

UPDATE 语句与 FOREIGN KEY 约束冲突 “表A_FK00”。数据库“mydatabase”中发生冲突,表 "tableA" ,列 'myID'。

我已将 myID 的更新规则设置为“级联”并将外键约束强制设置为“否”,但我仍然无法更新。我该怎么办?

【问题讨论】:

  • 你为什么需要更新你的PK?似乎这里有些事情没有正确完成。
  • 在存在级联更新规则的情况下,对主键的任何更改/更新都会反映到外键。在这种情况下,您不必禁用外键约束。

标签: sql-server-2008


【解决方案1】:

如果 tableB 中有一条记录使用 PK 123456 引用 tableA 并且 tableB 是具有“tableA_FK00”约束的表,那么您违反了约束。如果您必须更改 tableA 中一行的 PK(我不确定您为什么要这样做,PK 永远不应该改变!!!)您有责任确保没有其他记录使用 FK 约束引用它。

所以如果你坚持要改变tableA中的PK:

  1. 查找具有约束“tableA_FK00”的表(确保它只有 tableB see post here)。
  2. 暂时移除tableB中的约束
  3. 更新表A
  4. 更新 TableB 中需要更改 FK 的所有行
  5. 在 tableB 上重新应用 FK 约束

另一种选择:

  1. 将表 B 中 FK 为 123456 的所有行的 ID 插入临时表(该表只有表 B 中 PK 的键)
  2. 将 tableB FK 字段设置为允许空值
  3. 通过加入 tableB PK 上的临时表来设置 tableB FK = null 中的所有字段
  4. 更改tableA中的行
  5. 通过加入临时表将 tableB 中的所有行设置为 999999。

【讨论】:

    【解决方案2】:

    试试这些步骤:

    • 暂时禁用 FK 约束 (ALTER TABLE tableA WITH NOCHECK CONSTRAINT ALL)。
    • 更新您的主键
    • 更新外键以匹配主键更改
    • 启用反向执行 FK 约束

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-15
      • 2010-10-22
      • 2015-04-08
      • 1970-01-01
      相关资源
      最近更新 更多