Itu tergantung pada apa yang ingin Anda uji tepatnya .
Skema informasi?
Untuk menemukan "apakah tabel itu ada" (tidak peduli siapa yang bertanya ), menanyakan skema informasi (information_schema.tables
) salah , sebenarnya, karena (per dokumentasi):
Hanya tabel dan tampilan tersebut yang diperlihatkan bahwa pengguna saat ini memiliki akses ke (dengan cara menjadi pemilik atau memiliki hak istimewa).
Kueri yang diberikan oleh @kong dapat mengembalikan FALSE
, tetapi tabel masih bisa ada. Ini menjawab pertanyaan:
Bagaimana cara memeriksa apakah tabel (atau tampilan) ada, dan pengguna saat ini memiliki akses ke sana?
SELECT EXISTS (
SELECT FROM information_schema.tables
WHERE table_schema = 'schema_name'
AND table_name = 'table_name'
);
Skema informasi terutama berguna untuk tetap portabel di seluruh versi utama dan di seluruh RDBMS yang berbeda. Tetapi implementasinya lambat, karena Postgres harus menggunakan tampilan yang canggih untuk memenuhi standar (information_schema.tables
adalah contoh yang agak sederhana). Dan beberapa informasi (seperti OID) hilang dalam terjemahan dari katalog sistem - yang sebenarnya membawa semua informasi.
Katalog sistem
Pertanyaan Anda adalah:
Bagaimana cara memeriksa apakah ada tabel?
SELECT EXISTS (
SELECT FROM pg_catalog.pg_class c
JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE n.nspname = 'schema_name'
AND c.relname = 'table_name'
AND c.relkind = 'r' -- only tables
);
Gunakan katalog sistem pg_class
dan pg_namespace
langsung, yang juga jauh lebih cepat. Namun, per dokumentasi pada pg_class
:
Katalog
pg_class
tabel katalog dan hampir semua hal lain yang memiliki kolom atau serupa dengan tabel. Ini termasuk indeks (tetapi lihat jugapg_index
), urutan , tampilan , tampilan yang terwujud , jenis komposit , dan tabel TOAST;
Untuk pertanyaan khusus ini, Anda juga dapat menggunakan tampilan sistem pg_tables
. Sedikit lebih sederhana dan lebih portabel di seluruh versi Postgres utama (yang hampir tidak menjadi perhatian untuk kueri dasar ini):
SELECT EXISTS (
SELECT FROM pg_tables
WHERE schemaname = 'schema_name'
AND tablename = 'table_name'
);
Pengidentifikasi harus unik di antara semua objek yang disebutkan di atas. Jika Anda ingin bertanya:
Bagaimana cara memeriksa apakah nama untuk tabel atau objek serupa dalam skema tertentu diambil?
SELECT EXISTS (
SELECT FROM pg_catalog.pg_class c
JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE n.nspname = 'schema_name'
AND c.relname = 'table_name'
);
- Jawaban terkait di dba.SE membahas "Skema informasi vs. katalog sistem"
Alternatif:transmisikan ke regclass
SELECT 'schema_name.table_name'::regclass
Ini menimbulkan pengecualian jika tabel (secara opsional memenuhi syarat skema) (atau objek lain yang menempati nama itu) tidak ada.
Jika Anda tidak memenuhi syarat skema nama tabel, cast ke regclass
default ke search_path
dan mengembalikan OID untuk tabel pertama yang ditemukan - atau pengecualian jika tabel tidak ada dalam skema yang terdaftar. Perhatikan bahwa skema sistem pg_catalog
dan pg_temp
(skema untuk objek sementara dari sesi saat ini) secara otomatis menjadi bagian dari search_path
.
Anda dapat menggunakannya dan menangkap kemungkinan pengecualian dalam suatu fungsi. Contoh:
- Periksa apakah ada urutan di Postgres (plpgsql)
Kueri seperti di atas menghindari kemungkinan pengecualian dan karenanya sedikit lebih cepat.
to_regclass(rel_name)
di Postgres 9.4+
Jauh lebih sederhana sekarang:
SELECT to_regclass('schema_name.table_name');
Sama seperti pemerannya, tetapi ia kembali ...
... null daripada membuat kesalahan jika nama tidak ditemukan