Apakah ada cara menggunakan SQL untuk mendaftar semua kunci asing untuk tabel yang diberikan? Saya tahu nama tabel / skema dan saya bisa pasang itu.
sql
postgresql
smack0007
sumber
sumber
Jawaban:
Anda dapat melakukan ini melalui tabel information_schema. Sebagai contoh:
sumber
FROM information_schema.table_constraints AS tc JOIN information_schema.key_column_usage AS kcu USING (constraint_schema, constraint_name) JOIN information_schema.constraint_column_usage AS ccu USING (constraint_schema, constraint_name)
psql melakukan ini, dan jika Anda memulai psql dengan:
itu akan menunjukkan kepada Anda apa yang dieksekusi. Dalam hal menemukan kunci asing, itu adalah:
Dalam hal ini, 16485 adalah angka tertinggi dari tabel yang saya lihat - Anda bisa mendapatkannya dengan hanya membuang nama tab Anda ke regclass seperti:
Skema-kualifikasi nama tabel jika tidak unik (atau yang pertama di Anda
search_path
):sumber
SELECT conname, pg_catalog.pg_get_constraintdef(r.oid, true) as condef FROM pg_catalog.pg_constraint r WHERE r.confrelid = 'myschema.mytable'::regclass;
psql -E -U username -d database ThenWHAT
?Masalah
\d+ tablename
pada prompt PostgreSQL, di samping menampilkan tipe data kolom tabel itu akan menampilkan indeks dan kunci asing.sumber
Jawaban Ollyc baik karena tidak spesifik untuk Postgres, namun rusak ketika kunci asing merujuk lebih dari satu kolom. Query berikut berfungsi untuk jumlah kolom yang berubah-ubah tetapi sangat bergantung pada ekstensi Postgres:
sumber
Perpanjangan resep ollyc:
Kemudian:
SELECT * FROM foreign_keys_view WHERE table_name='YourTableNameHere'
;sumber
periksa posting ff untuk solusi Anda dan jangan lupa untuk menandai ini ketika Anda merasa ini berguna
http://errorbank.blogspot.com/2011/03/list-all-foreign-keys-references-for.html
sumber
Kueri ini berfungsi dengan benar dengan kunci komposit:
sumber
Saya pikir apa yang Anda cari dan sangat dekat dengan apa yang ditulis @ollyc adalah ini:
Ini akan mencantumkan semua tabel yang menggunakan tabel yang Anda tentukan sebagai kunci asing
sumber
singkat tapi manis jika itu bekerja untuk Anda.
sumber
Tidak ada jawaban yang ada yang memberikan saya hasil dalam bentuk yang saya inginkan. Jadi, inilah pertanyaan saya (raksasa) untuk mencari informasi tentang kunci asing.
Beberapa catatan:
from_cols
danto_cols
bisa sangat disederhanakan pada Postgres 9.4 dan kemudian menggunakanWITH ORDINALITY
daripada peretasan fungsi-fungsi-jendela yang saya gunakan.UNNEST
. Saya rasa tidak akan, tetapi saya tidak memiliki kunci asing multi-kolom dalam dataset saya untuk diuji. Menambahkan 9,4 niceties menghilangkan kemungkinan ini sama sekali.ORDER BY
fungsi agregat)STRING_AGG
denganARRAY_AGG
jika Anda menginginkan array kolom daripada string yang dipisahkan koma.-
sumber
Satu cara lagi:
sumber
Anda dapat menggunakan katalog sistem PostgreSQL . Mungkin Anda dapat meminta pg_constraint untuk meminta kunci asing. Anda juga dapat menggunakan Skema Informasi
sumber
Gunakan nama Kunci Utama yang menjadi acuan Kunci dan tanyakan informasi_schema:
Di sini 'TABLE_NAME_pkey' adalah nama Kunci Utama yang dirujuk oleh Kunci Asing.
sumber
Berikut ini adalah solusi oleh Andreas Joseph Krogh dari milis PostgreSQL: http://www.postgresql.org/message-id/[email protected]
Solusi ini menangani kunci asing yang merujuk beberapa kolom, dan menghindari duplikat (yang beberapa jawaban lainnya gagal lakukan). Satu-satunya hal yang saya ubah adalah nama variabel.
Berikut adalah contoh yang mengembalikan semua
employee
kolom yang mereferensikanpermission
tabel:sumber
Untuk memperluas jawaban Martin yang unggul di sini adalah kueri yang memungkinkan Anda memfilter berdasarkan tabel induk dan menunjukkan kepada Anda nama tabel anak dengan setiap tabel induk sehingga Anda dapat melihat semua tabel / kolom dependen berdasarkan pada batasan kunci asing di tabel induk.
sumber
Solusi yang tepat untuk masalah ini, menggunakan
information_schema
, bekerja dengan tombol multi kolom, menggabungkan kolom dengan nama yang berbeda di kedua tabel dengan benar dan juga kompatibel dengan ms sqlsever:Catatan: Ada beberapa perbedaan antara implementasi potgresql dan sqlserver
information_schema
yang membuat jawaban teratas memberikan hasil yang berbeda pada kedua sistem - satu memperlihatkan nama kolom untuk tabel kunci asing dan lainnya untuk tabel kunci primer. Karenanya, saya memutuskan untuk menggunakan tampilan KEY_COLUMN_USAGE.sumber
ORDINAL_POSITION
dapat menghasilkan hasil yang salah ketika urutan kolom dalam kunci asing berbeda dari urutan kolom dalam batasan unik. Saya percaya Anda harus bergabung dikcu_foreign.POSITION_IN_UNIQUE_CONSTRAINT = kcu_primary.ORDINAL_POSITION
Pembaruan : Juga, kunci asing mungkin bergantung pada batasan UNIK juga, jadi saya pikir Anda harus menghapuspks.CONSTRAINT_TYPE
kondisi dan hanya dapat bergabungrc
untukkcu_primary
langsungsumber
Saya menulis solusi yang suka dan sering digunakan. Kode ini ada di http://code.google.com/p/pgutils/ . Lihat tampilan pgutils.foreign_keys.
Sayangnya, hasilnya terlalu bertele-tele untuk dimasukkan di sini. Namun, Anda dapat mencobanya di versi publik dari database di sini, seperti ini:
Ini bekerja dengan setidaknya 8,3. Saya mengantisipasi memperbaruinya, jika perlu, dalam beberapa bulan ke depan.
-Menerima
sumber
Saya membuat sedikit alat untuk query dan kemudian membandingkan skema basis data: Dump PostgreSQL db schema ke teks
Ada info tentang FK, tetapi respons ollyc memberikan rincian lebih lanjut.
sumber
Catatan: Jangan lupa urutan kolom saat membaca kolom kendala!
sumber
Ini adalah apa yang saya gunakan saat ini, itu akan mencantumkan tabel dan itu adalah batasan fkey [hapus tabel klausa dan akan mencantumkan semua tabel di katalog saat ini]:
sumber
yang tercepat untuk memverifikasi jawaban langsung berdasarkan sepenuhnya pada jawaban ini
sumber