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

NMa*_*Man 32 sql-server

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

这是我的查询和错误:

begin tran
update question set questionparent = 10000, questionid= 10005 where questionid = 11000;
Run Code Online (Sandbox Code Playgroud)
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

我不记得该怎么做这就是为什么我在这里.有帮助吗?

pjp*_*pjp 44

你的人际关系是否正常

ON UPDATE CASCADE 
Run Code Online (Sandbox Code Playgroud)

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

例如

ALTER TABLE Books 
ADD CONSTRAINT fk_author 
FOREIGN KEY (AuthorID) 
REFERENCES Authors (AuthorID) ON UPDATE CASCADE 
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案。我觉得它最接近地解决了 OP 的问题,并且比目前接受的答案更好。 (3认同)
  • 确定:`开始交易; DELETE FROM ParentTable WHERE ID =?; ROLLBACK;`如果您看到FK违规,那么FK的更新受到限制. (2认同)

van*_*van 22

你可以:

  1. 暂时禁用强制执行FK约束(请参阅此处此处)
  2. 更新你的PK
  3. 更新你的FK
  4. 启用后台强制执行FK约束

在事务中完成所有操作并确保如果事务失败,则将其正确回滚并仍然强制执行FK约束.

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


rcp*_*rcp 14

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

  1. 在设计模式下打开表
  2. 单击顶部工具栏中的关系按钮
  3. 选择所需的FK关系(逐个)
  4. 右侧 - 展开INSERT或UPDATE规范
  5. 将UPDATE规则更改为 - 级联

关闭并保存,完成!

(试过SQL 2008)


小智 8

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

  1. 使用旧PK将行复制为具有新PK的行
  2. 更新FK
  3. 删除旧PK的行

优点:在此过程中没有违反约束.