Existe uma maneira de usar o SQL para listar todas as chaves estrangeiras para uma determinada tabela? Conheço o nome da tabela / esquema e posso conectá-lo.
sql
postgresql
smack0007
fonte
fonte
Respostas:
Você pode fazer isso através das tabelas information_schema. Por exemplo:
fonte
FROM information_schema.table_constraints AS tc JOIN information_schema.key_column_usage AS kcu USING (constraint_schema, constraint_name) JOIN information_schema.constraint_column_usage AS ccu USING (constraint_schema, constraint_name)
O psql faz isso e se você iniciar o psql com:
mostrará exatamente qual consulta é executada. No caso de encontrar chaves estrangeiras, é:
Nesse caso, 16485 é o oid da tabela que estou vendo - você pode obtê-lo simplesmente lançando seu nome de tabela para regclassar como:
Qualifique o nome da tabela se ele não for exclusivo (ou o primeiro no seu
search_path
):fonte
SELECT conname, pg_catalog.pg_get_constraintdef(r.oid, true) as condef FROM pg_catalog.pg_constraint r WHERE r.confrelid = 'myschema.mytable'::regclass;
psql -E -U username -d database ThenWHAT
?Problema
\d+ tablename
no prompt do PostgreSQL, além de mostrar os tipos de dados da coluna da tabela, ele mostra os índices e as chaves estrangeiras.fonte
A resposta de Ollyc é boa, pois não é específica do Postgres, no entanto, é interrompida quando a chave estrangeira faz referência a mais de uma coluna. A consulta a seguir funciona para um número arbitrário de colunas, mas depende muito das extensões do Postgres:
fonte
Extensão à receita ollyc:
Então:
SELECT * FROM foreign_keys_view WHERE table_name='YourTableNameHere'
;fonte
verifique o post ff para a sua solução e não se esqueça de marcar isso quando você achar isso útil
http://errorbank.blogspot.com/2011/03/list-all-foreign-keys-references-for.html
fonte
Esta consulta funciona corretamente com chaves compostas também:
fonte
Eu acho que o que você estava procurando e muito próximo do que a @ollyc escreveu é o seguinte:
Isso listará todas as tabelas que usam sua tabela especificada como uma chave estrangeira
fonte
voto curto, mas doce, se funcionar para você.
fonte
Nenhuma das respostas existentes me deu resultados da forma que eu realmente queria. Então, aqui está minha (gigantesca) consulta para encontrar informações sobre chaves estrangeiras.
Algumas notas:
from_cols
eto_cols
podem ser bastante simplificadas no Postgres 9.4 e posterior usandoWITH ORDINALITY
em vez da hackery que usa as funções da janela que estou usando.UNNEST
. Acho que não, mas não tenho chaves estrangeiras de várias colunas no meu conjunto de dados para testar. A adição das 9,4 sutilezas elimina completamente essa possibilidade.ORDER BY
funções agregadas)STRING_AGG
porARRAY_AGG
se desejar uma matriz de colunas em vez de uma sequência separada por vírgula.-
fonte
Um outro caminho:
fonte
Você pode usar os catálogos do sistema PostgreSQL . Talvez você possa consultar o pg_constraint para solicitar chaves estrangeiras. Você também pode usar o esquema de informações
fonte
Use o nome da Chave Primária à qual as Chaves estão fazendo referência e consulte o information_schema:
Aqui 'TABLE_NAME_pkey' é o nome da chave primária referenciada pelas chaves estrangeiras.
fonte
Aqui está uma solução de Andreas Joseph Krogh da lista de discussão do PostgreSQL: http://www.postgresql.org/message-id/[email protected]
Esta solução lida com chaves estrangeiras que fazem referência a várias colunas e evita duplicatas (o que algumas das outras respostas não conseguem fazer). A única coisa que mudei foram os nomes das variáveis.
Aqui está um exemplo que retorna todas as
employee
colunas que fazem referência àpermission
tabela:fonte
Para expandir a excelente resposta de Martin, aqui está uma consulta que permite filtrar com base na tabela pai e mostra o nome da tabela filho com cada tabela pai, para que você possa ver todas as tabelas / colunas dependentes com base nas restrições de chave estrangeira em a tabela pai.
fonte
Solução adequada para o problema, usando
information_schema
, trabalhando com chaves de várias colunas, unindo colunas de nomes diferentes nas duas tabelas corretamente e também compatível com o ms sqlsever:Nota: Existem algumas diferenças entre as implementações do potgresql e do sqlserver,
information_schema
que fazem com que a resposta superior dê resultados diferentes nos dois sistemas - um mostra os nomes das colunas da tabela de chaves estrangeiras e o outro da tabela de chaves primárias. Por esse motivo, decidi usar a exibição KEY_COLUMN_USAGE.fonte
ORDINAL_POSITION
pode gerar um resultado incorreto quando a ordem das colunas na chave estrangeira é diferente da ordem das colunas na restrição exclusiva. Eu acredito que você deve se juntaram emkcu_foreign.POSITION_IN_UNIQUE_CONSTRAINT = kcu_primary.ORDINAL_POSITION
Atualização : Além disso, uma chave estrangeira pode depender de uma restrição UNIQUE, bem, então eu acho que você deve remover apks.CONSTRAINT_TYPE
condição e pode apenas participarrc
dekcu_primary
diretamentefonte
Eu escrevi uma solução que gosta e usa com freqüência. O código está em http://code.google.com/p/pgutils/ . Veja a visualização pgutils.foreign_keys.
Infelizmente, a saída é muito extensa para incluir aqui. No entanto, você pode experimentá-lo em uma versão pública do banco de dados aqui, assim:
Isso funciona com 8.3, pelo menos. Antecipo atualizá-lo, se necessário, nos próximos meses.
-Reece
fonte
Criei uma pequena ferramenta para consultar e comparar o esquema do banco de dados: Dump PostgreSQL db schema to text
Há informações sobre o FK, mas a resposta do ollyc fornece mais detalhes.
fonte
Nota: Não esqueça a ordem das colunas ao ler as colunas de restrição!
fonte
Isto é o que estou usando atualmente, ele listará uma tabela e suas restrições de fkey [remover a cláusula de tabela e listará todas as tabelas no catálogo atual]:
fonte
o mais rápido a verificar a resposta direta no bash com base inteiramente nessa resposta
fonte