【发布时间】:2020-01-28 06:51:31
【问题描述】:
这似乎很简单,但我一直无法找到这个问题的答案。
我想要什么?一个主表,其中的行在不再被引用(通过外键)时会自行删除。该解决方案可能特定于 PostgreSql,也可能不特定于 PostgreSql。
如何? 我解决此问题的一种方法(实际上是迄今为止唯一的方法)涉及以下内容:对于引用此主表的每个表,在 UPDATE 或 DELETE一行,要检查 master 中的引用行,还有多少其他行仍然引用引用的行。如果它下降到零,那么我也会在 master 中删除该行。
(如果你有更好的想法,我很想知道!)
详细说明: 我有一个被许多其他人引用的主表
CREATE TABLE master (
id serial primary key,
name text unique not null
);
所有其他表格通常具有相同的格式:
CREATE TABLE other (
...
master_id integer references master (id)
...
);
如果其中一个不是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
请注意,即使我有很多表引用master,也不会花费太长时间来解决这个问题。如何在不引发错误的情况下找出这些信息?
【问题讨论】:
标签: sql postgresql foreign-keys