在两个表中更新作为主键的同时也是外键的 SQL Server

7 浏览
0 Comments

在两个表中更新作为主键的同时也是外键的 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 数据库错误:更新语句与参考约束"FK_GoalRequirement_Question"冲突。冲突发生在数据库"numgmttest"的表"dbo.GoalRequirement"的"QuestionID"列中。   14  0

我不记得如何处理这个问题,所以才来这里寻求帮助。有人能帮忙吗?

0
0 Comments

如果你想以图形方式设置级联规则,可以在SQL Management Studio中设置级联规则:

  1. 以设计模式打开表
  2. 点击顶部工具栏上的“关系”按钮
  3. 逐个选择所需的外键关系
  4. 右侧 - 展开“插入”或“更新”规范
  5. 将“更新”规则更改为“级联”

关闭并保存,完成!

(在SQL 2008上尝试过)

问题的原因:

- 主键同时也是外键,存在两个表之间的关联关系。

- 需要更新主键的值,但是由于存在外键约束,无法直接修改主键的值。

解决方法:

- 使用SQL Management Studio以图形方式设置级联规则。

- 将更新规则更改为“级联”,这样当主键的值改变时,与之关联的外键也会被自动更新。

请注意,以上解决方法是在SQL 2008中尝试过的,如果使用其他版本的SQL Server,可能会有所不同。

0
0 Comments

在SQL Server中,当一个主键同时也是一个外键在两个表中使用时,更新这个主键可能会出现问题。下面是解决这个问题的原因和方法。

解决方法如下:

1. 暂时禁用外键约束(参见链接:herehere

2. 更新主键

3. 更新外键

4. 启用外键约束

在一个事务中完成所有操作,并确保如果事务失败,正确回滚并重新启用外键约束。

但是...为什么需要更改主键?我希望这是一个很少执行的操作(例如遗留数据导入等)。

在我的情况下,因为我需要合并来自第二个数据库实例的数据,所以将第一个数据库中的所有ID都设置为超过范围,这将使我能够从第二个数据库批量插入到第一个数据库中。

0
0 Comments

问题的原因是,当主键同时也是外键的时候,在SQL Server中更新主键时会出现问题。如果在关系中定义了“ON UPDATE CASCADE”关键字,那么更改主键表中的键将会更新外键。解决方法是,可以通过以下脚本来检查是否启用了外键约束:BEGIN TRANSACTION; DELETE FROM ParentTable WHERE ID = ?; ROLLBACK; 如果出现FK违规,则意味着外键的更新是受限制的。这个答案最接近问题,并且以比当前接受的答案更好的方式回答了问题。另外,对于大量记录的罕见批量操作,可以考虑接受的答案以提高性能,并在通常的业务场景中禁止此类更改。

0