如果主键也是另一个表的外键,如何更新主键?

时间:2012-01-30 04:44:47

标签: sql-server-2008

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

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

update tableA
set myID = 123456
where myID= 999999

我收到了这个错误:

  

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

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

2 个答案:

答案 0 :(得分:0)

尝试以下步骤:

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

答案 1 :(得分:0)

如果tableB中有一条记录引用具有PK 123456的tableA而tableB是具有“tableA_FK00”约束的表,则表示您违反了约束。如果你必须改变tableA中一行的PK(我不知道你为什么这样做,PK应该永远不会改变!!!)你有责任确保没有其他记录用FK约束引用它。 / p>

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

  1. 查找哪个表具有约束“tableA_FK00”(确保它只是tableB see post here)。
  2. 暂时删除tableB中的约束
  3. 更新tableA
  4. 更新TableB中需要更改其FK的所有行
  5. 在tableB上重新应用FK约束
  6. 另一种选择:

    1. 将tableB中所有行的ID与FK 123456一起插入临时表(此表只包含来自tableB的PK的键)
    2. 将tableB FK字段设置为允许空值
    3. 通过连接tableB PK
    4. 上的临时表,设置tableB FK = null中的所有字段
    5. 更改tableA
    6. 中的行
    7. 通过连接临时表,将tableB中的所有行设置为999999。