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