使用SQL更新具有外键的表

12

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

当我尝试更新任一表时,我会收到“UPDATE语句与REFERENCE约束冲突”的错误提示,这是指外键约束。

我该如何更新这两个表中的语言字段?


1
看起来你的 y 在引用(外键)表中不存在。你需要先添加它。 - Oded
1
SQL Server?MySQL?Oracle?你有循环外键吗? - gbn
8个回答

10

如果您只需进行一次修复,请删除约束,进行更新,然后重新添加约束。

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


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

OP没有说明这是一次性的还是业务逻辑的一部分。该方法适用于一次性转换,但不适用于基于应用程序的交易。 - KM.

5

4

+1 这也是我想的... 除非数据库引擎不支持此功能。 - gbn

2

首先需要禁用约束条件,进行更新操作后再启用约束条件。

可以参考 OdeToCode 的 这篇文章 进一步了解。


2

我总是对禁用约束持谨慎态度,如果这是常见操作,你真的不想这样做。

一个相当丑陋的替代方法是: - 基于要更新的行创建父表中的一行,但包含新的外键值 - 更新所有包含旧值的外键的子行为新值。 - 删除现在未使用的父键行

由于许多明显的原因,这种方法很笨拙,可能不适合您的实现,但它在数据库中保持引用完整性。


0
您可以创建一个新行,使用更新后的数据并删除旧行。

1
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Noel

0

删除约束,执行更新操作,然后重新添加约束

ALTER TABLE X DROP CONSTRAINT constraint_fkey;

UPDATE TABLE Y SET col1='', id=2 WHERE id=3;

ALTER TABLE X ADD CONSTRAINT constraint_fkey FOREIGN KEY (X_id) REFERENCES Y(id);

postgres (PostgreSQL) 14.5


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接