Документация по PostgreSQL 9.1.1 | ||||
---|---|---|---|---|
Prev | Fast Backward | Chapter 8. Типы данных | Fast Forward | Next |
Идентификаторы объектов (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 |
regproc | pg_proc | имя функции | sum |
regprocedure | pg_proc | функция с типами аргументов | sum(int4) |
regoper | pg_operator | имя оператора | + |
regoperator | pg_operator | оператор с типами аргумента | *(integer,integer) or -(NONE,integer) |
regclass | pg_class | имя таблицы | pg_type |
regtype | pg_type | имя типа данных | integer |
regconfig | pg_ts_config | конфигурация для текстового поиска | english |
regdictionary | pg_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.)