Ne, k regclass nepotřebujete obsazení při volání funkce jako nextval který přijímá regclass parametr, protože existuje implicitní přetypování z text do regclass . V některých jiných kontextech explicitní přetypování na regclass může být vyžadováno.
Vysvětlení:
::regclass je přetypování, jako ::integer .
regclass je "magický" datový typ; je to vlastně alias pro oid , nebo "identifikátor objektu". Viz Typy identifikátorů objektů
v dokumentaci. Odesílání do regclass je zkratka, jak říci „toto jméno relace, převeďte jej prosím na oid tohoto vztahu“. Odesílá do regclass jsou si vědomi search_path , na rozdíl od dotazování pg_class pro oid vztahu přímo, takže přetypování na regclass není přesně ekvivalentní s dílčím dotazem pg_class .
Tabulky jsou vztahy. Stejně tak sekvence a pohledy. Takže můžete získat oid pohledu nebo sekvence také přetypováním do regclass.
Pro text jsou definována implicitní přetypování do regclass , takže pokud vynecháte explicitní přetypování a voláte funkci, která přijímá regclass obsazení se provádí automaticky. Takže ne potřebujete jej například v nextval hovory.
Jsou i jiná místa, kde můžete. Nemůžete například porovnávat text přímo pomocí oid; takže můžete udělat toto:
regress=> select * from pg_class where oid = 'table1'::regclass;
ale ne toto:
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';
Jen pro zábavu jsem zkusil napsat dotaz, který provedl ekvivalentní operaci přetypování do regclass . Nepoužívejte to, je to hlavně pro zábavu a jako pokus o ukázku toho, co se vlastně děje. Pokud vás opravdu nezajímá, jak fungují vnitřnosti Pg, můžete přestat číst zde.
Pokud tomu rozumím, 'sequence_name'::regclass::oid je zhruba ekvivalentní následujícímu dotazu:
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;
až na to, že je mnohem kratší a mnohem rychlejší. Viz Funkce systémových informací
pro definici current_schemas(...) , atd.
Jinými slovy:
- Získejte pole ab se seznamem všech schémat, ke kterým máme přístup, a spárujte každý záznam s pořadovým číslem pro jeho pozici v poli
- Vyhledejte
pg_classpro vztahy s odpovídajícími jmény a přidružit každý k jeho jmennému prostoru (schématu) - Seřaďte seznam zbývajících vztahů podle pořadí, ve kterém se jejich schémata objevila v
search_path - a vyberte první shodu