Не, нямате нужда от прехвърлянето към 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
- и изберете първото съвпадение