모든 테이블의 기본 키 나열-PostgreSQL


14

그렇게 할 쿼리가 있습니까?

하나의 테이블에 대해이 작업을 수행 할 수있는 쿼리를 찾았지만 볼 수 없도록 수정할 수 없었습니다.

tablename | column | type

1
이 질문을하면 PK에서 열의 서수 위치를 알고 싶습니다 (일부 PK에는 열이 2 개 이상 있으며 순서가 중요 할 수 있음).
ypercubeᵀᴹ

답변:


13

이 같은:

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;

이 쿼리는 기본 키뿐만 아니라 고유 인덱스도 보여줍니다
Michał Niklas

@ MichałNiklas 그렇지 않습니다.
dezso

1
@DarielPratama : 조건 tc.constraint_type = 'PRIMARY KEY'은 기본 키만 표시합니다. 그러나 각각의 기본 키는 고유 indexe의 지원을받습니다
a_horse_with_no_name

2
@a_horse_with_no_name 이것이 잘못되었다고 믿습니다. position_in_unique_constraintFOREIGN 키의 위치를 ​​나타내며 기본 키의 경우 항상 null입니다. 올바른 열은 ordinal_position입니다. PG 9.4에서 테스트되었습니다.
greatvovan

1
@a_horse_with_no_name 익명 사용자가 제안한 수정 사항을 승인했습니다. 편집이 진행되는지 확실하지 않으면 다른 사람들이 거부했습니다. 어쨌든 greatvovan의 제안과 의견을 확인하십시오. 나는 그들이 정확하고 ordinal_position사용해야 한다고 생각 합니다. 는 position_in_unique_constraint단지 FKS 사용에 널 (null)이 아닙니다.
ypercubeᵀᴹ

20

이것은 더 정확한 답변입니다.

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부품을 놓쳤 으므로 모든 구속 조건이 나열됩니다.


2
쿼리가 작동하는 동안 더 중요한 차이점은 누락 된 and kc.position_in_unique_constraint is not null부분입니다. 그리고 ANSI JOIN을 사용하는 것이 좋습니다 (많은 사람들이 그것을 맛의 문제라고 생각합니다).
dezso

1

이것도 고려하십시오. 모든 테이블을 변경하는 스크립트가 생성됩니다.

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;

질문은 테이블을 변경하는 방법을 묻지 않습니다.
ypercubeᵀᴹ

1
나는 @ ypercubeᵀᴹsays 두 번째. 이 답변을 삭제하되 낙담하지 마십시오. 둘러보기, 도움말 센터를 방문하여 "도움이 필요하면 도와주세요"블로그를 참조하십시오. 묻지 않은 것에 대답하는 것에 관해서는, 우리는 그 많은 시간을 많이했습니다 :-). ps 포럼에 오신 것을 환영합니다!
Vérace

1

기본 키와 외래 키를 얻으려면 다음과 같이해야합니다. 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;

나는 이런 식으로하려고합니다 (테이블 이름은 약간 다릅니다, 아마도 다른 버전의 postgres에있을 것입니다). 쿼리가 실행되지만 결과가 다시 나타나지 않습니다. 올바른 권한이 없을 수 있습니까?
szeitlin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.