Подтвердить что ты не робот

Что означает regclass в Postgresql

У меня есть следующая строка в инструкции CREATE TABLE:

field1_id bigint DEFAULT nextval('table1_field1_id_seq'::regclass) NOT NULL,

Что означает regclass в приведенном выше? Это абсолютное требование добавить ::regclass?

NB: Я видел документацию Postgresql , которая рассказывает о regclass, но не могла ее понять.

4b9b3361

Ответ 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
  • и выберите первое совпадение

Ответ 2

Из того, что я понимаю в документации, oid подразделяются на типы. regclass - объекты базы данных, представляющие отношения (так, чтобы они принадлежали таблице метаданных pg_class).

Он выражает зависимость между последовательностью и выражением DEFAULT (что означает процесс создания значения по умолчанию, если явно не указано явное значение в запросе INSERT), так что, если один из них испускает DROP SEQUENCE ... на последовательность, запрос не пройдет, если он не каскадируется (написав DROP SEQUENCE table1_field1_id_seq CASCADE).