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

Sql server 2008 如果主键也是另一个表的外键,如何更新它?,sql-server-2008,Sql Server 2008,我有一个表tableA,它有一个列myID。myID是tableA中的主键,也是tableB的外键 当我试图更新表a中某个特定记录的myID时: update tableA set myID = 123456 where myID= 999999 我得到了这个错误: UPDATE语句与外键约束冲突 “tableA_FK00”。数据库“mydatabase”表中发生冲突 “表A”,第“myID”列 我已经将myID的更新规则设置为“Cascade”,并将外键约束强制为“No”,但仍然无法更新。我

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

当我试图更新表a中某个特定记录的myID时:

update tableA
set myID = 123456
where myID= 999999
我得到了这个错误:

UPDATE语句与外键约束冲突 “tableA_FK00”。数据库“mydatabase”表中发生冲突 “表A”,第“myID”列

我已经将myID的更新规则设置为“Cascade”,并将外键约束强制为“No”,但仍然无法更新。我应该如何继续?

尝试以下步骤:

  • 暂时禁用FK约束(
    ALTER TABLE tableA WITH NOCHECK
    约束全部
  • 更新您的主键
  • 更新外键以匹配主键更改
  • 启用反向强制FK约束

如果tableB中有一条记录引用了带有PK 123456的tableA,而tableB是带有“tableA_FK00”约束的表格,则您违反了该约束。如果您必须更改tableA中某一行的主键(我不知道您为什么这样做,主键永远不应该更改!!!),那么您就有责任确保没有其他记录使用FK约束引用它

因此,如果您坚持更改表A中的PK:

update tableA
set myID = 123456
where myID= 999999
  • 查找具有约束“tableA_FK00”的表(确保它仅为tableB)
  • 暂时删除表B中的约束
  • 更新表a
  • 更新表B中需要更改FK的所有行
  • 在表B上重新应用FK约束
  • 另一种选择:

  • 将带有FK 123456的tableB中的所有行ID插入临时表(此表仅包含tableB中PK的键)
  • 将tableB FK字段设置为允许空值
  • 通过与tableB PK上的临时表连接,设置tableB FK=null中的所有字段
  • 更改表A中的行
  • 通过连接临时表,将表B中的所有行设置为999999

  • 为什么你需要更新你的PK?这里似乎有些事情做得不好。请查看此帖子:在存在级联更新规则的情况下,主键的任何更改/更新都会反映到外键。在这种情况下,不必禁用外键约束。