Eu tenho uma tabela my_tables
que é referenciada como chave estrangeira em várias tabelas.
Gostaria de selecionar todas as linhas my_table
que não são referenciadas em outra tabela.
AFAIK, deve ser possível fazer isso de maneira genérica (com alguma mágica de introspecção).
Citando o manual:
Então isso não é necessariamente limitado ao PK. Mas se começarmos com
pg_constraint
, obteremos todas as restrições FK apontando para a tabela de destino automaticamente. Não há necessidade de fornecer colunas de chave - exceto se você quiser limitar a determinados FKs.Usando o tipo de identificadores de objeto
regclass
e aliases de tabela, podemos manter a função curta e o resultado seguro e inequívoco:Consulta básica
Produz uma consulta do formulário:
Que retorna todas as linhas que não são referenciadas atualmente por nenhuma restrição FK.
Se
cardinality(c.conkey) > 1
então é seguro assumir tambémcardinality(c.confkey) > 1
. Portanto, conte apenas uma vez para decidir se deseja adicionar parênteses.Automação completa
Para fazer isso funcionar para qualquer tabela de entrada dinamicamente, crie uma função polimórfica pegando um valor de linha da tabela:
Ligue (importante)!
Ou:
Relacionado:
Aqui está uma consulta de exemplo que permite criar a instrução sql:
O exemplo de saída está abaixo;
o link do violino está aqui