PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Какво означава regclass в Postgresql

Не, нямате нужда от прехвърлянето към regclass когато извиквате функция като nextval който приема regclass параметър, тъй като има имплицитно предаване от text към regclass . В някои други контексти изрично преобразуване към regclass може да се наложи.

Обяснение:

::regclass е каст, като ::integer .

regclass е "магически" тип данни; това всъщност е псевдоним за oid , или "идентификатор на обект". Вижте Типове идентификатор на обект в документацията. Прехвърляне към regclass е кратък начин да се каже "това е името на релация, моля, преобразувайте го в oid на тази релация". Прехвърля към regclass знаят за search_path , за разлика от заявката за pg_class за oid на релация директно, така че прехвърлянето към regclass не е точно еквивалентно на подзапитване pg_class .

Таблиците са релации. Такива са последователностите и изгледите. Така че можете да получите oid на изглед или последователност чрез кастинг и към regclass.

За text са дефинирани неявни прехвърляния към regclass , така че ако пропуснете изричното преобразуване и извиквате функция, която приема regclass кастингът се извършва автоматично. Така че не имате нужда от него например в nextval обаждания.

Има и други места, където можете. Например не можете да сравнявате text директно с oid; така че можете да направите това:

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

но не и това:

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

Просто за забавление се опитах да напиша заявка, която изпълнява еквивалентната операция на кастинг към regclass . Не го използвайте, той е предимно за забавление и като опит да демонстрирате какво всъщност се случва. Освен ако наистина не се интересувате как работят вътрешностите на Pg, можете да спрете да четете тук.

Както разбирам, 'sequence_name'::regclass::oid е приблизително еквивалентен на следната заявка:

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;

с изключение на това, че е много по-кратък и много по-бърз. Вижте Функции за системна информация за дефиницията на current_schemas(...) и т.н.

С други думи:

  • Вземете ab масив, изброяващ всички схеми, до които имаме достъп, и сдвоете всеки запис с пореден номер за позицията му в масива
  • Търсете pg_class за релации със съвпадащи имена и асоциирайте всяко с неговото пространство от имена (схема)
  • Сортирайте списъка с оставащи отношения по реда, в който техните схеми са се появили в search_path
  • и изберете първото съвпадение


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Прозоречна функция на PostgreSQL:дял чрез сравнение

  2. Postgresql:Уникално ограничение над обединение на 2 колони

  3. Първичен ключ за множество колони в PostgreSQL?

  4. Деактивиране на DELETE на таблица в PostgreSQL?

  5. ResultTransformer със createSQLQuery не налага CamelCase в полетата на обекта