Czy istnieje takie zapytanie?
Znalazłem kilka zapytań, które mogą to zrobić dla jednej tabeli, ale nie byłem w stanie go zmodyfikować, więc widzę:
tablename | column | type
Czy istnieje takie zapytanie?
Znalazłem kilka zapytań, które mogą to zrobić dla jednej tabeli, ale nie byłem w stanie go zmodyfikować, więc widzę:
tablename | column | type
Odpowiedzi:
Coś takiego:
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'
pokaże tylko klucze podstawowe. Jednak każdy klucz podstawowy jest chroniony unikalnym indexe
position_in_unique_constraint
wskazuje pozycję klucza OBCEGO, dla kluczy podstawowych zawsze jest pusta. Prawidłowa kolumna to ordinal_position
. Testowane w PG 9.4.
ordinal_position
powinny być używane. Nie position_in_unique_constraint
jest zerowy tylko w użyciu FK.
To jest dokładniejsza odpowiedź:
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;
Brakowało and kc.constraint_name = tc.constraint_name
części, więc zawiera listę wszystkich ograniczeń.
and kc.position_in_unique_constraint is not null
część. I gorąco zachęcamy do korzystania z ANSI JOIN (choć wielu uważa, że to kwestia gustu).
Weź to również pod uwagę. Spowoduje to wygenerowanie skryptu do zmiany wszystkich tabel.
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;
Myślę, że klucz podstawowy i klucz obcy powinny zrobić tak. kc.position_in_unique_constraint nie ma wartości NULL, warunek ten może uzyskać tylko klucze obce.
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;