PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Co oznacza regclass w Postgresql

Nie, nie potrzebujesz rzutowania na regclass podczas wywoływania funkcji, takiej jak nextval który akceptuje regclass parametr, ponieważ istnieje niejawny rzut z text do regclass . W niektórych innych kontekstach jawne rzutowanie na regclass może być wymagane.

Wyjaśnienie:

::regclass jest rzutowaniem, jak ::integer .

regclass jest „magicznym” typem danych; to właściwie alias dla oid lub „identyfikator obiektu”. Zobacz Typy identyfikatorów obiektów w dokumentacji. Przesyłanie do regclass to skrótowy sposób powiedzenia „to jest nazwa relacji, proszę zamień ją na oid tej relacji”. Przesyła do regclass są świadomi search_path , w przeciwieństwie do zapytania pg_class dla oid relacji bezpośrednio, więc rzutowanie na regclass nie jest dokładnie równoważne z podzapytaniem pg_class .

Tabele to relacje. Podobnie sekwencje i widoki. Możesz więc uzyskać oid widoku lub sekwencji, rzutując również na regclass.

Istnieją niejawne rzutowania zdefiniowane dla text do regclass , więc jeśli pominiesz jawne rzutowanie i wywołujesz funkcję, która akceptuje regclass obsada odbywa się automatycznie. Więc nie potrzebujesz go na przykład w nextval połączeń.

Są inne miejsca, w których możesz. Na przykład nie możesz porównać text bezpośrednio z oid; więc możesz to zrobić:

regress=> select * from pg_class where oid = 'table1'::regclass;

ale nie to:

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';

Dla zabawy próbowałem napisać zapytanie, które wykonało równoważną operację rzutowania do regclass . Nie używaj go, to głównie dla zabawy i jako próba zademonstrowania tego, co się naprawdę dzieje. Jeśli nie jesteś naprawdę zainteresowany tym, jak działają wnętrzności Pg, możesz przestać czytać tutaj.

Jak rozumiem, 'sequence_name'::regclass::oid jest mniej więcej odpowiednikiem następującego zapytania:

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;

poza tym, że jest dużo krótsza i dużo szybsza. Zobacz Funkcje informacji o systemie dla definicji current_schemas(...) itp.

Innymi słowy:

  • Pobierz tablicę ab zawierającą listę wszystkich schematów, do których mamy dostęp i sparuj każdy wpis z liczbą porządkową określającą jego pozycję w tablicy
  • Wyszukaj pg_class dla relacji z pasującymi nazwami i skojarz każdą z ich przestrzenią nazw (schematem)
  • Posortuj listę pozostałych relacji według kolejności, w jakiej ich schematy pojawiły się w search_path
  • i wybierz pierwszy mecz


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nowy sposób na spersonalizowanie monitorowania PostgreSQL za pomocą Prometheusa

  2. Jak pisać wielką literą każdego słowa w PostgreSQL

  3. Złożony klucz podstawowy wymusza ograniczenia NOT NULL na zaangażowanych kolumnach

  4. Hibernacja uruchamiania bardzo wolno

  5. Krotka do listy — typ zwracania rekordu SETOF w Pythonie / PostgreSQL