PostgreSql: Obtém todas as linhas referenciando (através de chaves estrangeiras) uma linha particular em uma tabela
Isso parece tão simples, mas não consegui encontrar uma resposta para essa pergunta.
O que eu quero? Uma tabela mestra com linhas que se excluem sempre que não são referenciadas (via chaves estrangeiras). A solução pode ou não ser específica do PostgreSql.
Como? Uma das minhas abordagens para resolver esse problema (na verdade, a única abordagem até agora) envolve o seguinte: Para cada tabela que faz referência a essa tabela mestra, emUPDATE
ouDELETE
de uma linha, para verificar a linha referenciada no mestre, quantas outras outras linhas ainda se referem à linha referenciada. Se cair para zero, eu também excluo essa linha no master.
(Se você tem uma ideia melhor, eu gostaria de saber!)
Em detalhe: Eu tenho uma tabela mestre referenciada por muitos outros
CREATE TABLE master (
id serial primary key,
name text unique not null
);
Todas as outras tabelas têm o mesmo formato geralmente:
CREATE TABLE other (
...
master_id integer references master (id)
...
);
Se um desses não forNULL
, eles se referem a uma linha emmaster
. Se eu for para isso e tentar apagá-lo, receberei uma mensagem de erro, porque já está mencionado:
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
Note que não demora muito para descobrir isso, mesmo que eu tenha muitas tabelas referenciandomaster
. Como descubro essa informação sem ter que gerar um erro?