8.19. Идентификаторы объектов
Идентификатор объекта (Object Identifier, OID) используется внутри PostgreSQL в качестве первичного ключа различных системных таблиц. В пользовательские таблицы столбец OID добавляется, только если при создании таблицы указывается WITH OIDS
или включён параметр конфигурации default_with_oids. Идентификатор объекта представляется в типе oid
. Также для типа oid
определены следующие псевдонимы: regproc
, regprocedure
, regoper
, regoperator
, regclass
, regtype
, regrole
, regnamespace
, regconfig
и regdictionary
. Обзор этих типов приведён в Таблице 8.24.
В настоящее время тип oid
реализован как четырёхбайтное целое. Таким образом, значение этого типа может быть недостаточно большим для обеспечения уникальности в базе данных или даже в отдельных больших таблицах. Поэтому в пользовательских таблицах использовать столбец типа OID в качестве первичного ключа не рекомендуется. Лучше всего ограничить применение этого типа обращениями к системным таблицам.
Для самого типа oid
помимо сравнения определены всего несколько операторов. Однако его можно привести к целому и затем задействовать в обычных целочисленных вычислениях. (При этом следует опасаться путаницы со знаковыми/беззнаковыми значениями.)
Типы-псевдонимы 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
находит таблицу согласно заданному пути поиска схем, так что он делает «всё правильно» автоматически. Аналогично, приведя идентификатор таблицы к типу regclass
, можно получить символическое представление числового кода.
Таблица 8.24. Идентификаторы объектов
Имя | Ссылки | Описание | Пример значения |
---|---|---|---|
oid | any | числовой идентификатор объекта | 564182 |
regproc | pg_proc | имя функции | sum |
regprocedure | pg_proc | функция с типами аргументов | sum(int4) |
regoper | pg_operator | имя оператора | + |
regoperator | pg_operator | оператор с типами аргументов | *(integer,integer) или -(NONE,integer) |
regclass | pg_class | имя отношения | pg_type |
regtype | pg_type | имя типа данных | integer |
regrole | pg_authid | имя роли | smithee |
regnamespace | pg_namespace | пространство имён | pg_catalog |
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
, и не позволит удалить последовательность раньше, чем будет удалено это выражение. Единственным исключением является тип regrole
. Константы этого типа в таких выражениях не допускаются.
Примечание
Типы псевдонимов OID не полностью следуют правилам изоляции транзакций. Планировщик тоже воспринимает их как простые константы, что может привести к неоптимальному планированию запросов.
Есть ещё один тип системных идентификаторов, xid
, представляющий идентификатор транзакции (сокращённо xact). Этот тип имеют системные столбцы xmin
и xmax
. Идентификаторы транзакций определяются 32-битными числами.
Третий тип идентификаторов, используемых в системе, — cid
, идентификатор команды (command identifier). Этот тип данных имеют системные столбцы cmin
и cmax
. Идентификаторы команд — это тоже 32-битные числа.
И наконец, последний тип системных идентификаторов — tid
, идентификатор строки/кортежа (tuple identifier). Этот тип данных имеет системный столбец ctid
. Идентификатор кортежа представляет собой пару (из номера блока и индекса кортежа в блоке), идентифицирующую физическое расположение строки в таблице.
(Подробнее о системных столбцах рассказывается в Разделе 5.4.)
8.21. Pseudo-Types
The Postgres Pro type system contains a number of special-purpose entries that are collectively called pseudo-types. A pseudo-type cannot be used as a column data type, but it can be used to declare a function's argument or result type. Each of the available pseudo-types is useful in situations where a function's behavior does not correspond to simply taking or returning a value of a specific SQL data type. Table 8.27 lists the existing pseudo-types.
Table 8.27. Pseudo-Types
Name | Description |
---|---|
any | Indicates that a function accepts any input data type. |
anyelement | Indicates that a function accepts any data type (see Section 37.2.5). |
anyarray | Indicates that a function accepts any array data type (see Section 37.2.5). |
anynonarray | Indicates that a function accepts any non-array data type (see Section 37.2.5). |
anyenum | Indicates that a function accepts any enum data type (see Section 37.2.5 and Section 8.7). |
anyrange | Indicates that a function accepts any range data type (see Section 37.2.5 and Section 8.17). |
anymultirange | Indicates that a function accepts any multirange data type (see Section 37.2.5 and Section 8.17). |
anycompatible | Indicates that a function accepts any data type, with automatic promotion of multiple arguments to a common data type (see Section 37.2.5). |
anycompatiblearray | Indicates that a function accepts any array data type, with automatic promotion of multiple arguments to a common data type (see Section 37.2.5). |
anycompatiblenonarray | Indicates that a function accepts any non-array data type, with automatic promotion of multiple arguments to a common data type (see Section 37.2.5). |
anycompatiblerange | Indicates that a function accepts any range data type, with automatic promotion of multiple arguments to a common data type (see Section 37.2.5 and Section 8.17). |
anycompatiblemultirange | Indicates that a function accepts any multirange data type, with automatic promotion of multiple arguments to a common data type (see Section 37.2.5 and Section 8.17). |
cstring | Indicates that a function accepts or returns a null-terminated C string. |
internal | Indicates that a function accepts or returns a server-internal data type. |
language_handler | A procedural language call handler is declared to return language_handler . |
fdw_handler | A foreign-data wrapper handler is declared to return fdw_handler . |
table_am_handler | A table access method handler is declared to return table_am_handler . |
index_am_handler | An index access method handler is declared to return index_am_handler . |
tsm_handler | A tablesample method handler is declared to return tsm_handler . |
record | Identifies a function taking or returning an unspecified row type. |
trigger | A trigger function is declared to return trigger. |
event_trigger | An event trigger function is declared to return event_trigger. |
pg_ddl_command | Identifies a representation of DDL commands that is available to event triggers. |
void | Indicates that a function returns no value. |
unknown | Identifies a not-yet-resolved type, e.g., of an undecorated string literal. |
Functions coded in C (whether built-in or dynamically loaded) can be declared to accept or return any of these pseudo-types. It is up to the function author to ensure that the function will behave safely when a pseudo-type is used as an argument type.
Functions coded in procedural languages can use pseudo-types only as allowed by their implementation languages. At present most procedural languages forbid use of a pseudo-type as an argument type, and allow only void
and record
as a result type (plus trigger
or event_trigger
when the function is used as a trigger or event trigger). Some also support polymorphic functions using the polymorphic pseudo-types, which are shown above and discussed in detail in Section 37.2.5.
The internal
pseudo-type is used to declare functions that are meant only to be called internally by the database system, and not by direct invocation in an SQL query. If a function has at least one internal
-type argument then it cannot be called from SQL. To preserve the type safety of this restriction it is important to follow this coding rule: do not create any function that is declared to return internal
unless it has at least one internal
argument.