2012-01-30 91 views
2

我有一个表tableA,它有一个列myID。 myID是tableA中的主键和tableB的外键。如何更新主键如果它也是另一个表的外键?

当我试图TableA中更新特定记录的身份识别码:

update tableA 
set myID = 123456 
where myID= 999999 

我得到这个错误:

The UPDATE statement conflicted with the FOREIGN KEY constraint "tableA_FK00". The conflict occurred in database "mydatabase" , table "tableA" , column 'myID'.

我已经设置身份识别码的更新规则为“级联”和强制执行外键约束到'不',但我仍然无法更新。我应该如何继续?

+1

你为什么需要更新你的PK?似乎这里有些事情没有做好。 – 2012-01-30 04:47:54

+0

检查此帖:http://stackoverflow.com/questions/799100/changing-a-record-in-a-table-sql-server-that-has-foreign-keys – NoChance 2012-01-30 04:56:07

+0

在级联更新规则的存在下,任何更改/主键的更新会反映到外键。在这种情况下,您不必禁用外键约束。 – 2012-01-30 05:45:55

回答

0

请尝试以下步骤:

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

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

所以,如果你坚持在TableA的改变PK:

  1. 查找该表有约束 “tableA_FK00”(确保它是唯一tableB的see post here)。
  2. 暂时移除约束TableB中
  3. 更新TABLEA
  4. 更新TableB中需要他们的FK tableB的
  5. 改变
  6. 再涂FK约束

另一种选择的所有行:

  1. 将FK 123456中来自tableB的所有行的id插入临时表(该表只包含来自tableB的PK的键)
  2. 设置tableB的FK字段允许空值
  3. 设置TableB中FK各个领域= NULL通过tableB的PK
  4. 变化通过参加行表A
  5. 将所有的TableB中的行以999999与临时表加盟与临时表。
相关问题