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_classuntuk 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