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
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
Risposte:
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;
tc.constraint_type = 'PRIMARY KEY'
mostrerà solo le chiavi primarie. Tuttavia, ogni chiave primaria è supportata da un indexe univoco
position_in_unique_constraint
indica la posizione per la chiave ESTERA, è sempre nulla per le chiavi primarie. La colonna corretta è ordinal_position
. Testato in PG 9.4.
ordinal_position
dovrebbero essere usati. Il valore position_in_unique_constraint
non è nullo solo nell'utilizzo degli FK.
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_name
parte, quindi elenca tutti i vincoli.
and kc.position_in_unique_constraint is not null
parte mancante . E sei fortemente incoraggiato ad usare ANSI JOINs (mentre molti lo considerano una questione di gusti).
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;
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;