PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Bagaimana cara memeriksa apakah ada tabel dalam skema yang diberikan

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 juga pg_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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara Mendapatkan Waktu Saat Ini di PostgreSQL

  2. postgres - di mana di (daftar) - kolom tidak ada

  3. pg_restore Alternatif - Pencadangan PostgreSQL dan Pemulihan Otomatis dengan ClusterControl

  4. Apa itu PostgreSQL?

  5. Bagaimana Cosd() Bekerja di PostgreSQL