Daftar kunci utama untuk semua tabel - Postgresql


14

Apakah ada permintaan yang akan melakukannya?

Saya menemukan beberapa pertanyaan yang dapat melakukan ini untuk satu tabel, tetapi saya tidak dapat memodifikasinya sehingga saya dapat melihat:

tablename | column | type

1
Jika saya menanyakan hal ini, saya ingin mengetahui posisi ordinal kolom dalam PK (beberapa PK memiliki lebih dari 1 kolom dan urutannya penting).
ypercubeᵀᴹ

Jawaban:


13

Sesuatu seperti ini:

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;

Kueri ini tidak hanya menampilkan kunci utama tetapi juga indeks unik
Michał Niklas

@ MichałNiklas tidak.
dezso

1
@DarielPratama: kondisi tc.constraint_type = 'PRIMARY KEY'ini hanya akan menampilkan kunci utama. Namun setiap kunci utama didukung oleh indeks unik
a_horse_with_no_name

2
@a_horse_with_no_name Saya yakin ini salah. position_in_unique_constraintmenunjukkan posisi untuk kunci ASING, selalu nol untuk kunci primer. Kolom yang benar adalah ordinal_position. Diuji dalam PG 9.4.
greatvovan

1
@a_horse_with_no_name Saya telah menyetujui hasil edit yang disarankan oleh pengguna anonim. Tidak yakin apakah hasil edit akan diproses, yang lain telah menolak. Bagaimanapun, silakan periksa saran dan komentar di atas oleh greatvovan. Saya pikir mereka benar dan ordinal_positionharus digunakan. Ini position_in_unique_constraintbukan nol hanya dalam penggunaan FK.
ypercubeᵀᴹ

20

Ini jawaban yang lebih akurat:

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;

Anda melewatkan and kc.constraint_name = tc.constraint_namebagian tersebut, jadi itu mencantumkan semua kendala.


2
Saat kueri Anda berfungsi, perbedaan yang lebih penting adalah bagian yang hilang and kc.position_in_unique_constraint is not null. Dan Anda sangat dianjurkan untuk menggunakan ANSI JOINs (sementara banyak yang menganggapnya sebagai masalah selera).
dezso

1

Harap pertimbangkan ini juga. Ini akan menghasilkan skrip untuk mengubah semua 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;

Pertanyaannya tidak menanyakan bagaimana cara mengubah tabel.
ypercubeᵀᴹ

1
I second what @ ypercubeᵀᴹsays. Hapus jawaban ini, tetapi jangan berkecil hati - ikuti tur, kunjungi pusat bantuan dan baca blog "bantu kami untuk membantu Anda". Sedangkan untuk menjawab sesuatu yang tidak diminta, kita semua sering melakukannya :-). ps selamat datang di forum!
Vérace

1

Saya pikir untuk mendapatkan kunci primer dan kunci asing harus melakukan seperti ini. kc.position_in_unique_constraint bukan nol kondisi ini hanya dapat memperoleh kunci asing.

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;

Saya mencoba melakukan sesuatu seperti ini (nama tabel sedikit berbeda, saya mungkin pada versi postgres yang berbeda). Kueri berjalan tetapi saya tidak mendapatkan hasil apa pun. Mungkinkah saya tidak memiliki izin yang tepat-?
szeitlin
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.