Nej, du behøver ikke castet til regclass
når du kalder en funktion som nextval
der accepterer en regclass
parameter, da der er en implict cast fra text
til regclass
. I nogle andre sammenhænge en eksplicit cast til regclass
kan være påkrævet.
Forklaring:
::regclass
er en cast, som ::integer
.
regclass
er en "magisk" datatype; det er faktisk et alias for oid
, eller "objekt-id". Se Objektidentifikatortyper
i dokumentationen. Caster til regclass
er en genvej til at sige "dette er navnet på en relation, konverter det venligst til oid af denne relation". Caster til regclass
er opmærksomme på search_path
, i modsætning til at forespørge pg_class
for en relations oid
direkte, så casting til regclass svarer ikke nøjagtigt til at underforespørge pg_class
.
Tabeller er relationer. Det samme er sekvenser og synspunkter. Så du kan få udslaget af en visning eller sekvens ved også at caste til regclass.
Der er defineret implicitte casts for text
til regclass
, så hvis du udelader den eksplicitte cast, og du kalder en funktion, der accepterer regclass
støbningen udføres automatisk. Så det gør du ikke har brug for det i for eksempel nextval
opkald.
Der er andre steder, hvor du kan. For eksempel kan du ikke sammenligne text
direkte med oid
; så du kan gøre dette:
regress=> select * from pg_class where oid = 'table1'::regclass;
men ikke dette:
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';
For sjov prøvede jeg at skrive en forespørgsel, der udførte den tilsvarende operation som casting til regclass
. Brug det ikke, det er mest for sjov, og som et forsøg på at demonstrere, hvad der faktisk sker. Medmindre du virkelig er interesseret i, hvordan Pg's mod virker, kan du stoppe med at læse her.
Som jeg forstår det, 'sequence_name'::regclass::oid
svarer nogenlunde til følgende forespørgsel:
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;
bortset fra at det er meget kortere og meget hurtigere. Se Systeminformationsfunktioner
for definitionen af current_schemas(...)
osv.
Med andre ord:
- Få et ab-array, der viser alle skemaer, vi har adgang til, og parr hver post med et ordenstal for dens position i matrixen
- Søg
pg_class
for relationer med matchende navne og tilknyt hver enkelt med dets navneområde (skema) - Sortér listen over resterende relationer efter den rækkefølge, som deres skemaer blev vist i
search_path
- og vælg det første match