我有一个分类表,其中一个字段作为子分类表的外键。每个表的一部分主键是语言ID。我需要在这两个表中更新它们。基本上,在两个表中,无论何处语言ID = x,我都需要将其设置为y。
当我尝试更新任一表时,我会收到“UPDATE语句与REFERENCE约束冲突”的错误提示,这是指外键约束。
我该如何更新这两个表中的语言字段?
我有一个分类表,其中一个字段作为子分类表的外键。每个表的一部分主键是语言ID。我需要在这两个表中更新它们。基本上,在两个表中,无论何处语言ID = x,我都需要将其设置为y。
当我尝试更新任一表时,我会收到“UPDATE语句与REFERENCE约束冲突”的错误提示,这是指外键约束。
我该如何更新这两个表中的语言字段?
如果您只需进行一次修复,请删除约束,进行更新,然后重新添加约束。
如果您需要将此作为应用程序的一部分执行,则插入一个类别行,更新子类别行,然后删除原始类别行。
可以直接使用此方法,无需进行删除和添加操作。
ALTER TABLE Table_Name
NOCHECK CONSTRAINT FoerignKey_Name
--update query here
ALTER TABLE Table_Name
CHECK CONSTRAINT FoerignKey_Name
(本链接介绍如何在执行插入和更新语句时禁用外键约束)我总是对禁用约束持谨慎态度,如果这是常见操作,你真的不想这样做。
一个相当丑陋的替代方法是: - 基于要更新的行创建父表中的一行,但包含新的外键值 - 更新所有包含旧值的外键的子行为新值。 - 删除现在未使用的父键行
由于许多明显的原因,这种方法很笨拙,可能不适合您的实现,但它在数据库中保持引用完整性。
删除约束,执行更新操作,然后重新添加约束
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
y
在引用(外键)表中不存在。你需要先添加它。 - Oded