PostgreSQL 中 pg_class 上的 ON DELETE CASCADE 不起作用

met*_*dos 6 postgresql

我在我的表上添加了一个引用 pg_class 的外键。

ALTER TABLE summary_table 
ADD FOREIGN KEY (table_oid_column) REFERENCES pg_class (oid) ON DELETE CASCADE;
Run Code Online (Sandbox Code Playgroud)

我有一个汇总表,其中包含有关表及其关系 ID 的一些信息。当我删除一个表时,我想从我的汇总表中自动删除相关的行,所以我在上面添加了约束。但就我而言,当我放下一张桌子时,什么也没有发生。

我用测试表尝试过,当我从测试表中删除相关行时,它按预期工作。比如这个外键约束:

ALTER TABLE summary_table 
ADD FOREIGN KEY (table_oid_column) REFERENCES test (id) ON DELETE CASCADE;
Run Code Online (Sandbox Code Playgroud)

可能是什么问题?它是否与目录表(pg_class)或隐藏系统列(oid)有关?

Pet*_*aut 5

只有在执行 SQL 级别的 DML 命令(例如DELETE或 )时才会检查约束UPDATE。当您使用 DDL 命令(如DROP TABLE. 这些在内部采用不同的代码路径,即使它们最终修改了相同的数据。

因此,您目前无法做您想做的事情。在 PostgreSQL 9.3 中,会有事件触发器,这将解决您的问题所在的空间。


gra*_*emp 0

AFAIU 它不会工作(至少在 <9.2 中),因为外键约束基于触发器,并且系统目录表没有实现触发器。

在即将到来的 9.3 中,一些工作是朝着所谓的事件触发器的方向进行的,因此将有可能捕获 DDL 事件,例如 CREATE、ALTER、DROP。然而东西还是太有限了