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