Типы идентификаторов объектов

8.16. Типы идентификаторов объектов

Идентификаторы объектов (OIDs) используются внутри PostgreSQL как первичные ключи для разных системных таблиц. OIDs не добавляются к создаваемым пользователями таблицам, если только при создании таблицы не было указано WITH OIDS или если переменная окружения default_with_oids не была установлена в значение true. Тип oid представляется как идентификатор объекта. Существует несколько различных типов-псевдонимов для типа oid: regproc, regprocedure, regoper, regoperator, regclass, regtype, regconfig и regdictionary. Их обзор показан в Table 8-23.

Тип oid в настоящий момент реализован как беззнаковое четырёхбайтовое целое число. Таким образом, значение этого типа не настолько велико, чтобы обеспечить уникальность в пределах всей базы данных в больших базах данных или даже в отдельных больших таблицах. Так что, использование колонки OID в созданных пользователем таблицах в качестве первичного ключа, является неправильным. Значения OID лучше всего использовать только для ссылок в системных таблицах.

Тип oid сам имеет некоторые операции сравнения. Он может быть приведен к типу integer и таким образом значениями этого типа можно манипулировать используя стандартные операторы для типа integer. (Если будете так делать, то остерегайтесь возможных проблем с преобразованием знаковых чисел в беззнаковые).

Типы, которые являются псевдонимами OID не имеют своих собственных операций, за исключением специальных подпрограмм ввода и вывода. Эти подпрограммы нужны для ввода и отображения символьных имён системных объектов, а не для использования цифровых значений типа oid. Типы-псевдонимы позволяют упростить поиск значений OID для объектов. Например, чтобы увидеть в таблице pg_attribute строки, которые относятся к таблице mytable, можно выполнить запрос

SELECT * FROM pg_attribute WHERE attrelid = 'mytable'::regclass;

вместо

SELECT * FROM pg_attribute
  WHERE attrelid = (SELECT oid FROM pg_class WHERE relname = 'mytable');

Не говоря уже о том, что это выглядит плохо само по себе, это ещё и очень утрировано. Более сложный подзапрос нуждался бы в запросе правильного OID, если в других схемах существуют другие таблицы с именем mytable. Подпрограмма преобразовывания ввода значений типа regclass управляет поиском таблицы, соответствующей установленному пути поиска схем и таким образом она выполняет "правильную вещь" автоматически. Похожим образом, приведение табличного OID к типу regclass для выполнения символьного отображения цифрового значения OID происходит автоматически.

Table 8-23. Типы идентификаторов объектов

ИмяУказывает наОписаниеПример значения
oidвсё что угодноцифровой идентификатор объекта564182
regprocpg_procимя функцииsum
regprocedurepg_procфункция с типами аргументовsum(int4)
regoperpg_operatorимя оператора+
regoperatorpg_operatorоператор с типами аргумента*(integer,integer) or -(NONE,integer)
regclasspg_classимя таблицыpg_type
regtypepg_typeимя типа данныхinteger
regconfigpg_ts_configконфигурация для текстового поискаenglish
regdictionarypg_ts_dictсловарь для текстового поискаsimple

Все типы-псевдонимы OID допускают использование имён с указанием схем и будут отображать при выводе имена со схемами если только объект не будет найден в текущем пути поиска схемы, в этом случае имя схемы выводиться не будет. Типы-псевднимы regproc и regoper будут позволять вводить только имена, которые являются уникальными (не перегруженными), так что это типы ограниченного использования; для большинства случаев наиболее соответствующими будут тип regprocedure или regoperator. Для типа regoperator, унарные операторы идентифицируются с помощью NONE для неиспользуемого операнда.

Дополнительное стройство типов псевдонимов OID состоит в создании зависимостей. Если какая-либо константа одного из этих типов используется в хранимых выражениях (таких как выражения, используемые для генерации значений по умолчанию в колонках, а также в представлениях), она создаёт зависимость от объекта, на который она указывает. Например, если какая-либо колонка имеет выражение для генерации значения по умолчанию вида nextval('my_seq'::regclass), то PostgreSQL понимает, что это выражение зависит от последовательности my_seq; теперь СУБД не позволит удалить эту последовательность, если сперва не удалить данное выражение.

Другой тип идентификатора используемые СУБД — это xid или идентификатор транзации (аббревиатура от xact). Это тип данных системных колонок xmin и xmax. Идентификаторы транзакций являются 32-битными значениями.

Третий тип идентификатора используемый СУБД — это cid или идентификатор команд. Это тип данных системных колонок cmin и cmax. Идентификаторы команд также являются 32-битными значениями.

Последний тип идентификатора используемый СУБД — это tid или идентификатор записи (идентификатор строки таблицы). Это тип данных системной колонки ctid. Идентификатор записи — это пара (номер блока, индекс записи внутри блока) которая идентифицирует физическое расположения строки внутри своей таблицы.

(О системных колонках рассказывается далее в Section 5.4.)

Back to top

(С) Виктор Вислобоков, 2008-2023