sql >> Databáze >  >> RDS >> PostgreSQL

Co znamená regclass v Postgresql

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_class pro 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


  1. Přesměrujte nezpracované soubory .gif na stránku obslužné rutiny přes .htacces

  2. PostgreSQL:paralelní dotazování v akci

  3. Připojení ke vzdálenému serveru SQL Server 2008 z Windows Azure

  4. SQL:získat N-tou položku v každé skupině