2010-04-19 84 views
5

我有一个类别表,其中一个字段用作子类别表的外键。作为每个表的主键的一部分的一个字段是语言ID。我需要在两个表中更新这些。基本上,无论这两个表中的语言id = x,我都需要将它设置为y。SQL使用外键更新表

当我尝试在任一表上执行更新时,我得到一个'UPDATE语句与REFERENCE约束冲突..',它引用了外键约束。

如何更新这两个表上的语言字段?

+0

看起来像你的'y'不存在于引用的(外键)表中。您需要先添加它。 – Oded 2010-04-19 19:28:23

+1

SQL Server? MySQL的?甲骨文?你有圆形FK? – gbn 2010-04-19 19:41:40

回答

9

如果您正在进行1次修复,请删除约束UPDATE,然后再添加约束。

如果您需要将其作为应用程序的一部分执行此操作,请插入一个类别行,更新子类别行,然后删除原始类别行。

5

您需要删除约束,更新值,然后重新添加约束。

+0

OP不会说这是一次还是业务逻辑的一部分。此方法适用于一次性转换,但不适用于基于应用程序的事务。 – 2010-04-19 19:33:46

2

您将不得不首先禁用约束,然后执行更新,然后再次启用约束。

看看这个article由OdeToCode讨论这一点。

2

您可以将您的约束更改为ON UPDATE CASCADE

+0

+1这也是我的想法......除非数据库引擎不支持这个 – gbn 2010-04-19 19:41:05

2

我总是对禁用约束心存疑虑,而你真的不想这样做,如果这是一个常见的操作。

无可否认的另一种方法是: - 根据要更新但包含新外键值的行在父表中创建一行 - 更新外键包含旧值的所有子行新的价值。 - 删除当前未使用的父级密钥行

这对于任何数量的显而易见的原因都很尴尬,并且可能不适合您的实现,但它在数据库中保持参照完整性。