Elenca le chiavi primarie per tutte le tabelle - Postgresql


14

C'è una domanda che lo farà?

Ho trovato alcune query che possono eseguire questa operazione per una tabella, ma non sono stato in grado di modificarlo, quindi posso vedere:

tablename | column | type

1
Se lo chiedessi, mi piacerebbe conoscere la posizione ordinale di una colonna nel PK (alcuni PK hanno più di 1 colonne e l'ordine potrebbe avere importanza).
ypercubeᵀᴹ

Risposte:


13

Qualcosa come questo:

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;

Questa query mostra non solo chiavi primarie ma anche indici univoci
Michał Niklas

@ MichałNiklas no.
dezso

1
@DarielPratama: la condizione tc.constraint_type = 'PRIMARY KEY'mostrerà solo le chiavi primarie. Tuttavia, ogni chiave primaria è supportata da un indexe univoco
a_horse_with_no_name

2
@a_horse_with_no_name Credo che questo non sia corretto. position_in_unique_constraintindica la posizione per la chiave ESTERA, è sempre nulla per le chiavi primarie. La colonna corretta è ordinal_position. Testato in PG 9.4.
greatvovan,

1
@a_horse_with_no_name Ho approvato una modifica suggerita da un utente anonimo. Non sono sicuro se la modifica verrà eseguita, altri hanno rifiutato. In ogni caso, controlla il suggerimento e il commento sopra di greatvovan. Penso che siano corretti e ordinal_positiondovrebbero essere usati. Il valore position_in_unique_constraintnon è nullo solo nell'utilizzo degli FK.
ypercubeᵀᴹ

20

Questa è una risposta più accurata:

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;

Hai perso la and kc.constraint_name = tc.constraint_nameparte, quindi elenca tutti i vincoli.


2
Mentre la query funziona, la differenza più importante è la and kc.position_in_unique_constraint is not nullparte mancante . E sei fortemente incoraggiato ad usare ANSI JOINs (mentre molti lo considerano una questione di gusti).
dezso

1

Si prega di considerare anche questo. Questo genererà lo script per modificare tutte le tabelle.

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;

La domanda non chiede come modificare le tabelle.
ypercubeᵀᴹ

1
Secondo cosa dice @ ypercubeᵀᴹ. Elimina questa risposta, ma non scoraggiarti: partecipa al tour, visita il centro assistenza e leggi il blog "aiutaci ad aiutarti". Per quanto riguarda la risposta a qualcosa che non è stato chiesto, lo abbiamo fatto un sacco di volte :-). ps benvenuto nel forum!
Vérace,

1

Penso che ottenere la chiave primaria e la chiave esterna dovrebbe fare così. kc.position_in_unique_constraint non è null questa condizione può ottenere solo chiavi esterne.

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;

Sto cercando di fare qualcosa del genere (i nomi delle tabelle sono leggermente diversi, probabilmente sto usando una versione diversa di Postgres). La query viene eseguita ma non ottengo risultati. È possibile che non disponga delle autorizzazioni giuste-?
szeitlin,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.