답변:
이 같은:
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'
은 기본 키만 표시합니다. 그러나 각각의 기본 키는 고유 indexe의 지원을받습니다
position_in_unique_constraint
FOREIGN 키의 위치를 나타내며 기본 키의 경우 항상 null입니다. 올바른 열은 ordinal_position
입니다. PG 9.4에서 테스트되었습니다.
ordinal_position
사용해야 한다고 생각 합니다. 는 position_in_unique_constraint
단지 FKS 사용에 널 (null)이 아닙니다.
이것은 더 정확한 답변입니다.
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;
and kc.constraint_name = tc.constraint_name
부품을 놓쳤 으므로 모든 구속 조건이 나열됩니다.
and kc.position_in_unique_constraint is not null
부분입니다. 그리고 ANSI JOIN을 사용하는 것이 좋습니다 (많은 사람들이 그것을 맛의 문제라고 생각합니다).
이것도 고려하십시오. 모든 테이블을 변경하는 스크립트가 생성됩니다.
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;
기본 키와 외래 키를 얻으려면 다음과 같이해야합니다. kc.position_in_unique_constraint가 null이 아닌 경우이 조건은 외래 키만 가져올 수 있습니다.
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;