SQL Server更新主键,它也是两个表中的外键

时间:2009-09-04 14:07:10

标签: sql-server

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

这是我的查询和错误:

begin tran
update question set questionparent = 10000, questionid= 10005 where questionid = 11000;
Error  9/4/2009 10:04:49 AM    0:00:00.000 SQL Server Database Error: The UPDATE statement conflicted with the REFERENCE constraint "FK_GoalRequirement_Question". The conflict occurred in database "numgmttest", table "dbo.GoalRequirement", column 'QuestionID'.   14  0

我不记得如何去做这就是为什么我在这里。有什么帮助吗?

6 个答案:

答案 0 :(得分:40)

您的人际关系是否使用

ON UPDATE CASCADE 

如果他们正在更改主表中的密钥将更新外键。

e.g。

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

答案 1 :(得分:20)

你可以:

  1. 暂时禁用强制执行FK约束(请参阅herehere
  2. 更新你的PK
  3. 更新您的FK
  4. 启用后台强制执行FK约束
  5. 在事务中完成所有操作,并确保如果事务失败,则将其正确回滚并仍然强制执行FK约束。

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

答案 2 :(得分:14)

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

  1. 以设计模式打开表格
  2. 点击顶部工具栏中的“关系”按钮
  3. 选择所需的FK关系(逐个)
  4. 右侧 - 展开INSERT或UPDATE规范
  5. 将更新规则更改为 - 级联
  6. 关闭并保存,完成!

    (试用SQL 2008)

答案 3 :(得分:7)

由于我不太自信禁用FK约束,我也更喜欢:

  1. 使用旧PK复制行,使用新PK
  2. 更新FK
  3. 删除旧PK
  4. 的行

    优势:在此过程中没有违反约束。

答案 4 :(得分:2)

转到每个子表的外键关系以及插入和更新规范更改删除和更新规则以级联。这可能对你有所帮助

答案 5 :(得分:0)

-创建à具有相同数据和à不同主键的新行。 -更新所有儿童表。 -删除您整理数据的行 它完成了。