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

Apa arti regclass di Postgresql

Tidak, Anda tidak memerlukan pemeran untuk regclass saat memanggil fungsi seperti nextval yang menerima regclass parameter, karena ada pemeran implisit dari text ke regclass . Dalam beberapa konteks lain, pemeran eksplisit ke regclass mungkin diperlukan.

Penjelasan:

::regclass adalah pemeran, seperti ::integer .

regclass adalah tipe data "ajaib"; sebenarnya ini adalah alias untuk oid , atau "pengidentifikasi objek". Lihat Jenis pengenal objek dalam dokumentasi. Transmisi ke regclass adalah cara pintas untuk mengatakan "ini nama relasi, harap ubah ke oid relasi itu". Transmisikan ke regclass mengetahui search_path , tidak seperti kueri pg_class untuk oid suatu relasi langsung, jadi casting ke regclass tidak persis sama dengan subquerying pg_class .

Tabel adalah relasi. Begitu juga urutan, dan tampilan. Jadi Anda bisa mendapatkan tampilan atau urutan dengan casting ke regclass juga.

Ada pemeran implisit yang ditentukan untuk text ke regclass , jadi jika Anda menghilangkan pemeran eksplisit dan Anda memanggil fungsi yang menerima regclass casting dilakukan secara otomatis. Jadi Anda tidak membutuhkannya di, misalnya, nextval panggilan.

Ada tempat lain di mana Anda bisa. Misalnya Anda tidak dapat membandingkan text langsung dengan oid; sehingga Anda dapat melakukan ini:

regress=> select * from pg_class where oid = 'table1'::regclass;

tapi bukan ini:

regress=> select * from pg_class where oid = 'table1';
ERROR:  invalid input syntax for type oid: "table1"
LINE 1: select * from pg_class where oid = 'table1';

Hanya untuk bersenang-senang, saya mencoba menulis kueri yang melakukan operasi casting yang setara dengan regclass . Jangan gunakan itu, sebagian besar untuk bersenang-senang, dan sebagai upaya untuk mendemonstrasikan apa yang sebenarnya terjadi. Kecuali Anda benar-benar tertarik dengan cara kerja Pg, Anda bisa berhenti membaca di sini.

Seperti yang saya pahami, 'sequence_name'::regclass::oid kira-kira setara dengan kueri berikut:

WITH sp(sp_ord, sp_schema) AS (
  SELECT 
    generate_series(1, array_length(current_schemas('t'),1)),
    unnest(current_schemas('t'))
)
SELECT c.oid
FROM pg_class c INNER JOIN pg_namespace n ON (c.relnamespace = n.oid)
INNER JOIN sp ON (n.nspname = sp.sp_schema)
WHERE c.relname = 'sequence_name'
ORDER BY sp.sp_ord
LIMIT 1;

kecuali bahwa itu jauh lebih pendek dan jauh lebih cepat. Lihat Fungsi informasi sistem untuk definisi current_schemas(...) , dll.

Dengan kata lain:

  • Dapatkan larik ab yang mencantumkan semua skema yang dapat kami akses dan pasangkan setiap entri dengan nomor urut untuk posisinya dalam larik
  • Telusuri pg_class untuk relasi dengan nama yang cocok dan mengasosiasikan masing-masing dengan namespace (skema)
  • Urutkan daftar relasi yang tersisa menurut urutan munculnya skemanya di search_path
  • dan pilih pertandingan pertama


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. VBScript hang saat meluncurkan file batch dengan WShell.Script Run

  2. migrasi rel:postgresql untuk md5 string acak sebagai default

  3. Haruskah saya disconnect() jika saya menggunakan Apache::DBI's connect_cached()?

  4. Bagaimana Round() Bekerja di PostgreSQL

  5. Meja yang hilang pada tampilan yang terwujud