Ответ 1
Нет, при вызове функции, такой как nextval
, которая принимает параметр regclass
, вам не нужен приведение к regclass
, так как есть приведение импликации от text
до regclass
. В некоторых других контекстах может потребоваться явное преобразование в regclass
.
Объяснение:
::regclass
является литой, например ::integer
.
regclass
- это "магический" тип данных; это фактически псевдоним для oid
, или "идентификатор объекта". См. Типы идентификаторов объектов в документации. Кастинг regclass
- это ярлык, говорящий "это имя отношения, пожалуйста, преобразуйте его в форму этого отношения". Отправки до regclass
знают о search_path
, в отличие от запроса pg_class
для отношения oid
напрямую, поэтому приведение в regclass не совсем эквивалентно подзапросу pg_class
.
Таблицы - это отношения. Таким образом, это последовательности и представления. Таким образом, вы можете получить форму представления или последовательности, добавив в 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
- и выберите первое совпадение