Listar chaves primárias para todas as tabelas - Postgresql

14

Existe uma consulta que fará isso?

Encontrei algumas consultas que podem fazer isso em uma tabela, mas não consegui modificá-lo para que eu possa ver:

tablename | column | type
korda
fonte
1
Se eu estivesse perguntando isso, gostaria de saber a posição ordinal de uma coluna na PK (algumas PKs têm mais de uma coluna e a ordem pode ser importante).
ypercubeᵀᴹ

Respostas:

13

Algo assim:

select tc.table_schema, tc.table_name, kc.column_name
from information_schema.table_constraints tc
  join information_schema.key_column_usage kc 
    on kc.table_name = tc.table_name and kc.table_schema = tc.table_schema and kc.constraint_name = tc.constraint_name
where tc.constraint_type = 'PRIMARY KEY'
  and kc.ordinal_position is not null
order by tc.table_schema,
         tc.table_name,
         kc.position_in_unique_constraint;
um cavalo sem nome
fonte
Esta consulta mostra não apenas chaves primárias, mas também índices exclusivos
Michał Niklas
@ MichałNiklas não.
Dez29
1
@DarielPratama: a condição tc.constraint_type = 'PRIMARY KEY'mostrará apenas chaves primárias. No entanto, cada chave primária é apoiado por uma indexé única
a_horse_with_no_name
2
@a_horse_with_no_name Eu acredito que isso está incorreto. position_in_unique_constraintindica a posição da chave ESTRANGEIRA, é sempre nulo para as chaves primárias. A coluna é correcta ordinal_position. Testado na PG 9.4.
greatvovan
1
@a_horse_with_no_name Aprovou uma edição sugerida por usuário anônimo. Não tenho certeza se a edição será concluída, outras pessoas rejeitaram. De qualquer forma, verifique a sugestão e o comentário acima por greatvovan. Eu acho que eles estão corretos e ordinal_positiondevem ser usados. O position_in_unique_constraintnão é nulo apenas no uso de FKs.
precisa saber é o seguinte
20

Esta é uma resposta mais precisa:

select tc.table_schema, tc.table_name, kc.column_name 
from  
    information_schema.table_constraints tc,  
    information_schema.key_column_usage kc  
where 
    tc.constraint_type = 'PRIMARY KEY' 
    and kc.table_name = tc.table_name and kc.table_schema = tc.table_schema
    and kc.constraint_name = tc.constraint_name
order by 1, 2;

Você perdeu a and kc.constraint_name = tc.constraint_namepeça, portanto ela lista todas as restrições.

mikipero
fonte
2
Enquanto sua consulta funciona, a diferença mais importante é a and kc.position_in_unique_constraint is not nullparte que falta . E você é fortemente encorajado a usar ANSI JOINs (enquanto muitos consideram isso uma questão de gosto).
Dezso
1

Por favor, considere isso também. Isso irá gerar o script para alterar todas as tabelas.

SELECT STRING_AGG(FORMAT('ALTER TABLE %s CLUSTER ON %s;', A.table_name, A.constraint_name), E'\n') AS SCRIPT
FROM
(
    SELECT      FORMAT('%s.%s', table_schema, table_name) AS table_name, constraint_name
    FROM        information_schema.table_constraints
    WHERE       UPPER(constraint_type) = 'PRIMARY KEY'
    ORDER BY    table_name 
) AS A;
Martin
fonte
A pergunta não pergunta como alterar as tabelas.
ypercubeᵀᴹ
1
Eu segundo o que @ ypercubeᵀᴹsays. Exclua esta resposta, mas não desanime - faça o tour, visite o centro de ajuda e leia o blog "ajude-nos a ajudá-lo". Quanto a responder a algo que não foi perguntado, já fizemos isso várias vezes :-). ps bem-vindo ao fórum!
Vérace 29/07
1

Eu acho que obter chave primária e chave estrangeira deve fazer assim. kc.position_in_unique_constraint não é nulo, esta condição pode obter apenas chaves estrangeiras.

select tc.table_schema, tc.table_name, kc.column_name,tc.constraint_type
from 
    information_schema.table_constraints tc
    JOIN information_schema.key_column_usage kc 
        on kc.table_name = tc.table_name and kc.table_schema = tc.table_schema 
                and kc.constraint_name = tc.constraint_name
where 
--kc.position_in_unique_constraint is not null
order by tc.table_schema,
         tc.table_name,
         kc.position_in_unique_constraint;
Yuanwen Lee
fonte
Estou tentando fazer algo assim (os nomes das tabelas são um pouco diferentes, provavelmente estou em uma versão diferente do postgres). A consulta é executada, mas não recebo nenhum resultado de volta. É possível que eu não tenha as permissões corretas?
Szeitlin 14/08/19