禁用触发器来禁用外键约束是个好主意吗?

Sti*_*nin 1 postgresql trigger foreign-key

背景

我们正在将遗留应用程序从非关系型数据库迁移到 PostgreSQL。

问题

我们希望在许多字段上启用外键以实现未来的数据完整性,以便报告工具可以轻松确定哪些表已链接。某些当前数据无法通过 FK 检查,并且由于连接到数据库的旧应用程序,我们还无法打开 FK。

临时解决方案

一些程序员建议我们禁用数据库上的触发器,如此处所示,这样 FK 就不会被强制执行,但仍可用于报告工具。

我担心这会导致一系列其他意想不到的后果,但我不确定它们是什么。谁能消除我的恐惧或解释为什么这是一个非常糟糕的主意?我假设它不好的一个原因是它会禁用所有触发器,而不仅仅是触发 FK 约束的触发器。

a_h*_*ame 5

您可以使用选项创建外键约束NOT VALID。然后它们被声明,但不被强制执行:

create table parent (id integer primary key);
create table child (id integer primary key, pid integer);

insert into parent values (1),(2),(3);
insert into child values (1,100),(2,200),(3,300); --<< invalid pid values!

alter table child 
     add constraint fk_child_parent 
     foreign key (pid) references p (id) NOT VALID; --<< succeeds
Run Code Online (Sandbox Code Playgroud)