如何在postgresql中禁用外键约束
How to disable foreign key constraints in postgresql
我正在使用 AWS Aurora Postgres 并使用 DMS 从 RDS postgres 迁移到 Aurora PG。为了执行 FULL LOAD,我想在所有对象上禁用外键约束和触发器。我可以禁用触发器,但找不到禁用约束的方法。
以下无效:
改变TABLE so_items禁用约束so_items_so_id_fkey;
它抛出:
ERROR: syntax error at or near "CONSTRAINT"
LINE 1: ALTER TABLE so_items DISABLE CONSTRAINT so_items_so_id_fkey;
^
SQL state: 42601
Character: 30
在参数组中设置 "session_replication_role" = "replica" 无效。虽然 DMS 任务尝试截断准备的 table 部分,但它仍然因外键违规错误而失败。
请告知任何解决方法。
注意:我无法执行以下操作,因为在 RDS 中,即使使用主帐户我也无权执行此操作:
alter table so_items disable trigger ALL;
ERROR: permission denied: "RI_ConstraintTrigger_c_16520" is a system trigger
SQL state: 42501
您不应修改 Postgres 约束所依赖的触发器。这是您不应该关心的实现细节。
你不能禁用约束,真的。
要暂时关闭约束,您可以将约束检查推迟到交易结束时:
ALTER TABLE so_items ALTER CONSTRAINT so_items_so_id_fkey DEFERRABLE INITIALLY DEFERRED;
通过该修改,约束在当前事务结束时修改后进行评估。这将允许您打破事务内部的约束。
您可能 DROP CONSTRAINT
s
ALTER TABLE so_items DROP CONSTRAINT so_items_so_id_fkey;
这将永久删除它。
Edit:也可以禁用触发器,这也会影响 table
的外键约束
ALTER TABLE so_items DISABLE TRIGGER ALL;
但是当您之后重新启用触发器时,不会检查外键。这可能会导致数据库中的外键无效/不一致。
我正在使用 AWS Aurora Postgres 并使用 DMS 从 RDS postgres 迁移到 Aurora PG。为了执行 FULL LOAD,我想在所有对象上禁用外键约束和触发器。我可以禁用触发器,但找不到禁用约束的方法。
以下无效:
改变TABLE so_items禁用约束so_items_so_id_fkey;
它抛出:
ERROR: syntax error at or near "CONSTRAINT" LINE 1: ALTER TABLE so_items DISABLE CONSTRAINT so_items_so_id_fkey; ^ SQL state: 42601 Character: 30
在参数组中设置 "session_replication_role" = "replica" 无效。虽然 DMS 任务尝试截断准备的 table 部分,但它仍然因外键违规错误而失败。
请告知任何解决方法。
注意:我无法执行以下操作,因为在 RDS 中,即使使用主帐户我也无权执行此操作:
alter table so_items disable trigger ALL;
ERROR: permission denied: "RI_ConstraintTrigger_c_16520" is a system trigger SQL state: 42501
您不应修改 Postgres 约束所依赖的触发器。这是您不应该关心的实现细节。
你不能禁用约束,真的。
要暂时关闭约束,您可以将约束检查推迟到交易结束时:
ALTER TABLE so_items ALTER CONSTRAINT so_items_so_id_fkey DEFERRABLE INITIALLY DEFERRED;
通过该修改,约束在当前事务结束时修改后进行评估。这将允许您打破事务内部的约束。
您可能 DROP CONSTRAINT
s
ALTER TABLE so_items DROP CONSTRAINT so_items_so_id_fkey;
这将永久删除它。
Edit:也可以禁用触发器,这也会影响 table
的外键约束ALTER TABLE so_items DISABLE TRIGGER ALL;
但是当您之后重新启用触发器时,不会检查外键。这可能会导致数据库中的外键无效/不一致。