Liệt kê các khóa chính cho tất cả các bảng - Postgresql


14

Có một truy vấn sẽ làm điều đó?

Tôi đã tìm thấy một số truy vấn có thể thực hiện điều này cho một bảng, nhưng tôi không thể sửa đổi nó để tôi có thể thấy:

tablename | column | type

1
Nếu tôi hỏi điều này, tôi muốn biết vị trí thứ tự của một cột trong PK (một số PK có nhiều hơn 1 cột và thứ tự có thể có vấn đề).
ypercubeᵀᴹ

Câu trả lời:


13

Một cái gì đó như thế này:

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;

Truy vấn này không chỉ hiển thị các khóa chính mà còn các chỉ mục duy nhất
Michał Niklas

@ MichałNiklas thì không.
dezso

1
@DarielPratama: điều kiện tc.constraint_type = 'PRIMARY KEY'sẽ chỉ hiển thị các khóa chính. Tuy nhiên, mỗi khóa chính được hỗ trợ bởi một chỉ mục duy nhất
a_horse_with_no_name

2
@a_horse_with_no_name Tôi tin rằng điều này không chính xác. position_in_unique_constraintcho biết vị trí của khóa FOREIGN, nó luôn là null cho các khóa chính. Cột đúng là ordinal_position. Đã thử nghiệm trong PG 9.4.
greatvovan

1
@a_horse_with_no_name Tôi đã phê duyệt một chỉnh sửa được đề xuất bởi người dùng ẩn danh. Không chắc chắn nếu chỉnh sửa sẽ đi qua, những người khác đã từ chối. Trong mọi trường hợp, vui lòng kiểm tra đề xuất và nhận xét ở trên bởi greatvovan. Tôi nghĩ rằng chúng là chính xác và ordinal_positionnên được sử dụng. Các position_in_unique_constraintkhông là null chỉ trong việc sử dụng FKS.
ypercubeᵀᴹ

20

Đây là câu trả lời chính xác hơn:

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;

Bạn đã bỏ lỡ and kc.constraint_name = tc.constraint_namemột phần, vì vậy nó liệt kê tất cả các ràng buộc.


2
Trong khi truy vấn của bạn hoạt động, sự khác biệt quan trọng hơn là phần còn thiếu and kc.position_in_unique_constraint is not null. Và bạn được khuyến khích sử dụng ANSI THAM GIA (trong khi nhiều người coi đó là vấn đề của hương vị).
dezso

1

Hãy xem xét điều này cũng. Điều này sẽ tạo ra kịch bản để thay đổi tất cả các bảng.

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;

Câu hỏi không hỏi làm thế nào để thay đổi các bảng.
ypercubeᵀᴹ

1
Tôi thứ hai những gì @ ypercubeᵀᴹsays. Xóa câu trả lời này, nhưng đừng nản lòng - hãy tham quan, ghé thăm trung tâm trợ giúp và đọc blog "giúp chúng tôi giúp bạn". Đối với việc trả lời những điều không được hỏi, tất cả chúng ta đã thực hiện rất nhiều lần :-). Chào mừng bạn đến với diễn đàn!
Vérace

1

Tôi nghĩ để có được khóa chính và khóa ngoại nên làm như thế này. kc.poseition_in_unique_constraint không null điều kiện này chỉ có thể nhận được khóa ngoại.

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;

Tôi đang cố gắng làm một cái gì đó như thế này (tên bảng hơi khác nhau, có lẽ tôi đang ở một phiên bản khác của postgres). Truy vấn chạy nhưng tôi không nhận được bất kỳ kết quả nào. Có thể là tôi không có quyền-?
szeitlin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.