PostgreSql:获取引用(通过外键)表中特定行的所有行

cas*_*ava 8 sql database postgresql

这看起来很简单,但我无法找到这个问题的答案.

我想要什么?一个包含行的主表,只要它们不被引用(通过外键)就会自行删除.该解决方案可能是也可能不是PostgreSql特有的.

怎么样?我解决此问题的方法之一(实际上,到目前为止唯一的方法)涉及以下内容:对于引用此主表的每个表,在行UPDATEDELETE行上,检查master中引用的行,还有多少其他行仍然参考引用的行.如果它下降到零,那么我也删除master中的那一行.

(如果你有更好的主意,我想知道!)

详细说明: 我有一个由其他许多人引用的主表

CREATE TABLE master (
  id serial primary key,
  name text unique not null
);
Run Code Online (Sandbox Code Playgroud)

所有其他表通常具有相同的格式:

CREATE TABLE other (
  ...
  master_id integer references master (id)
  ...
);
Run Code Online (Sandbox Code Playgroud)

如果其中一个不是NULL,那么它们指的是一行master.如果我转到此并尝试删除它,我将收到一条错误消息,因为它已经被引用:

ERROR:  update or delete on table "master" violates foreign key constraint "other_master_id_fkey" on table "other"
DETAIL:  Key (id)=(1) is still referenced from table "other".
Time: 42.972 ms
Run Code Online (Sandbox Code Playgroud)

请注意,即使我有许多表引用,也不需要太长时间来解决这个问题master.如何在不提出错误的情况下找到此信息?

Igo*_*nko 5

您可以执行以下操作之一:

1) 将reference_count字段添加到主表。reference count每当master_id添加一行时,在详细信息表上使用触发器会增加。当行被删除时减少计数。当reference_count达到 0 - 删除记录。

2) 使用pg_constrainttable (details here ) 获取引用表的列表并创建动态 SQL 查询。

3)在每个明细表上创建触发器,master_id在主表中删除。静音错误消息BEGIN ... EXCEPTION ... END