sql >> Database teknologi >  >> RDS >> PostgreSQL

Hvad betyder regclass i Postgresql

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


  1. Sådan ændres mysql-dato til Ago i php

  2. hvordan man får adgang til kommandolinjen for xampp på Windows

  3. Hvordan pivoterer man tekstkolonner i SQL Server?

  4. hvordan får man værdi fra udvalgt forespørgsel i trigger i mysql5?