gpt4 book ai didi

postgresql - 当在 PostgreSQL 中的同一个表上定义两个具有冲突的删除时相等的外键时会发生什么?

转载 作者:行者123 更新时间:2023-11-29 11:47:29 28 4
gpt4 key购买 nike

为了删除外键约束引用的一些行而不在删除时级联,我创建了一个临时外键约束,删除了行,然后删除了临时约束:

ALTER TABLE rel_user_right
ADD CONSTRAINT temp_fk_rel_user_right_user_right_02
FOREIGN KEY (right_id) REFERENCES user_right (id)
ON DELETE CASCADE;

DELETE FROM user_right WHERE "name" LIKE '%.statusLight.%';

ALTER TABLE rel_user_right
DROP CONSTRAINT temp_fk_rel_user_right_user_right_02;

此表已经定义了以下约束:

ALTER TABLE rel_user_right
ADD CONSTRAINT fk_rel_user_right_user_right_02
FOREIGN KEY (right_id) REFERENCES user_right (id);

这对我来说工作正常,但在我同事的计算机上似乎失败了。如您所见,这两个 FK 约束定义了冲突的 ON DELETE 行为。在这种情况下是定义了优先级,还是不确定的?

最佳答案

Postgres 允许创建两个仅在 ON DELETE 不同的引用条款。我找不到关于这种情况影响的信息。

在我的测试中,我无法用新约束覆盖现有约束(即 DELETE 始终受到限制,尽管存在第二个级联 约束)。然而,这种行为没有记录在案,不应依赖它。

正常的处理方式应该是用新约束替换旧约束:

ALTER TABLE rel_user_right
ADD CONSTRAINT fk_rel_user_right_user_right_temp
FOREIGN KEY (right_id) REFERENCES user_right (id)
ON DELETE CASCADE,
DROP CONSTRAINT fk_rel_user_right_user_right;

DELETE FROM user_right WHERE "name" LIKE '%.statusLight.%';

ALTER TABLE rel_user_right
ADD CONSTRAINT fk_rel_user_right_user_right
FOREIGN KEY (right_id) REFERENCES user_right (id),
DROP CONSTRAINT fk_rel_user_right_user_right_temp;

DISABLE CONSTRAINT在这里会有用,但 Postgres 中没有这样的功能(曾尝试 implement it,但没有成功)。您可以使用 DISABLE TRIGGER对于它,但上面的解决方案更简单、更自然。

关于postgresql - 当在 PostgreSQL 中的同一个表上定义两个具有冲突的删除时相等的外键时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33236445/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com