2009-09-04 215 views
19

我需要更新记录的主键,但它也是另外两个表中的外键。而且我需要更新的主键也反映在子表中。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 

我不记得如何去这样做,所以这就是为什么我在这里。任何帮助?

+0

另一种选择:避免有一个可更改的主键。改为使用IDENTITY作为主键。对需要唯一的列保持唯一的约束。这可能超出了你的控制范围,但它对我们来说很好。我们的用户可以根据自己的需要更改ID,但不会影响实际的主键。 – 2009-09-04 14:23:34

回答

16

您可以:

  1. 禁止强制FK约束暂时(见herehere
  2. 更新您的PK
  3. 更新您的FKS
  4. 使背部执行FK约束

在交易中执行所有操作,并确保如果交易失败,则将其正确回滚并继续执行FK限制。

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

33

是使用

ON UPDATE CASCADE 

如果他们再改变主表中的键将更新外键的关系。

例如

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

任何方式都可以在不看脚本的情况下进行分析?我没有权限查看它。 – NMan 2009-09-04 14:18:17

+2

确定:'BEGIN TRANSACTION; DELETE FROM ParentTable WHERE ID =?; ROLLBACK;' 如果您看到FK违规,那么FK的更新受到限制。 – van 2009-09-04 14:29:58

+0

这应该是被接受的答案。我觉得它最贴近地解决了OP的问题,并且以比目前接受的答案更好的方式进行。 – 2013-12-30 18:35:06

1

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

+0

不知道为什么这得到了downvoted - 这与做出最高选票的答案完全一样,只在用户界面中而不在SQL中! – 2014-08-31 13:43:36

6

如果您想以图形设置级联规则,然后在SQL管理设置级联规则工作室

  1. 在设计模式打开表
  2. 点击关系从顶部的工具栏按钮
  3. 选择所需的FK关系(一一)
  4. 右侧 - 展开INSERT或UPDATE规格
  5. 更改更新规则来 - 级联

关闭并保存,完成!

(试戴SQL 2008)

+1

你是人! – 2016-12-20 10:42:43

4

由于我不是太有信心禁用FK约束,我更喜欢太:

  1. 复制与老PK行一个新PK
  2. 更新FKS
  3. 删除行与老PK

优势:无约束违反杜尔这个过程。