Идентификаторы объектов (OID) используются во внутренних механизмах
Digital Q.DataBase в качестве первичных ключей различных системных таблиц. Тип oid представляет собой идентификатор объекта. Также существует несколько типов-псевдонимов для oid, каждый из которых
имеет префикс reg.
Таблица 2.5.26 представляет собой
обзор.
что-либо
Тип oid тип в настоящее время реализован как четырехбайтовое целое число без знака. Следовательно, этот объем недостаточен для обеспечения уникальности в масштабе всей базы данных при работе с большими базами данных или даже с отдельными большими таблицами.
Тип oid Сам тип поддерживает лишь несколько операций, помимо сравнения. Однако он может быть приведен к типу 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.
Таблица 2.5.26. Типы идентификаторов объектов
| Имя | Ссылки | Описание | Пример значения |
|---|---|---|---|
oid | любой | числовой идентификатор объекта | 564182 |
regclass | pg_class | имя отношения | pg_type |
regcollation | pg_collation | имя правила сортировки | "POSIX" |
regconfig | pg_ts_config | конфигурация полнотекстового поиска | english |
regdictionary | pg_ts_dict | словарь полнотекстового поиска | simple |
regnamespace | pg_namespace | имя пространства имен | pg_catalog |
regoper | pg_operator | имя оператора | + |
regoperator | pg_operator | оператор с типами аргументов | *(integer,integer)
или -(NONE,integer) |
regproc | pg_proc | имя функции | sum |
regprocedure | pg_proc | функция с типами аргументов | sum(int4) |
regrole | pg_authid | имя роли | smithee |
regtype | pg_type | имя типа данных | integer |
Все типы-псевдонимы OID для объектов, группируемых по пространствам имен, принимают имена с указанием схемы и выводят их в таком же формате, если объект не находится в текущем пути поиска без явного указания схемы. Например, myschema.mytable является допустимым входным значением
для regclass (если такая таблица существует). Это значение
может быть выведено как myschema.mytable, или
просто mytable, в зависимости от текущего пути поиска.
Типы- regproc и regoper псевдонимы принимают только уникальные (не перегруженные) входные имена, поэтому они имеют ограниченное применение; для большинства случаев regprocedure или
regoperator более подходят. Для regoperator,
унарные операторы идентифицируются путем записи NONE для неиспользуемого
операнда.
Функции ввода для данных типов допускают наличие пробельных символов между токенами и переводят символы верхнего регистра в нижний, за исключением строк в двойных кавычках; это сделано для приведения правил синтаксиса в соответствие с правилами написания имен объектов в SQL. Напротив, функции вывода при необходимости используют двойные кавычки, чтобы результат являлся допустимым идентификатором SQL. Например, OID функции с именем Foo (с заглавной буквой F)
принимающей два целочисленных аргумента, можно ввести в виде
' "Foo" ( int, integer ) '::regprocedure. Вывод
будет выглядеть следующим образом "Foo"(integer,integer).
Имена функций и типов аргументов также могут быть
квалифицированы схемой.
Многие встроенные Digital Q.DataBase функции принимают
OID таблицы или другого объекта базы данных и для
удобства описаны как принимающие regclass (или соответствующий тип-псевдоним OID). Это означает, что вам не нужно искать OID объекта вручную, а можно просто ввести его имя как строковый литерал. Например, функция nextval(regclass) принимает
OID отношения-последовательности, поэтому её можно вызвать так:
nextval('foo') работает с последовательностью foo
nextval('FOO') то же, что и выше
nextval('"Foo"') работает с последовательностью Foo
nextval('myschema.foo') работает с myschema.foo
nextval('"myschema".foo') то же, что и выше
nextval('foo') выполняет поиск в пути поиска для foo
Когда аргумент такой функции записывается как простой строковый литерал, он становится константой типа regclass
(или соответствующего типа).
Поскольку фактически это просто OID, он будет отслеживать первоначально
идентифицированный объект, несмотря на последующее переименование, смену схемы
и т. д. Такое «раннее связывание» поведение обычно является предпочтительным для ссылок на объекты в значениях по умолчанию для столбцов и в представлениях. Но иногда может
потребоваться «позднее связывание» при котором ссылка на объект разрешается
во время выполнения. Чтобы обеспечить поведение позднего связывания, принудительно сохраните константу как текст константу вместо regclass:
nextval('foo'::text) foo ищется во время выполнения
Значение to_regclass() функция и аналогичные ей функции
также могут использоваться для поиска объектов во время выполнения. См.
Таблица 2.6.74.
Другой практический пример использования regclass
заключается в поиске OID таблицы, указанной в information_schema представлений, которые не предоставляют
такие OID напрямую. Например, может возникнуть необходимость вызвать
функцию pg_relation_size() , требующую
OID таблицы. С учётом вышеизложенных правил, правильный способ
сделать это выглядит так:
SELECT table_schema, table_name,
pg_relation_size((quote_ident(table_schema) || '.' ||
quote_ident(table_name))::regclass)
FROM information_schema.tables
WHERE ...
Тип quote_ident() автоматически заключит идентификаторы в двойные кавычки, если это необходимо. Кажущийся более простым вариант
SELECT pg_relation_size(table_name) FROM information_schema.tables WHERE ...
— не рекомендуется, так как он приведет к ошибке для таблиц, находящихся вне пути поиска (search_path) или имеющих имена, требующие использования кавычек.
Дополнительным свойством большинства типов-псевдонимов OID является создание зависимостей. Если константа одного из этих типов фигурирует в сохранённом выражении (например, в значении столбца по умолчанию или в определении представления), это создаёт зависимость от соответствующего объекта. Например, если для столбца задано выражение по умолчанию nextval('my_seq'::regclass),
Digital Q.DataBase
система понимает, что выражение по умолчанию зависит от последовательности
my_seq, поэтому она не позволит удалить эту последовательность без предварительного удаления выражения по умолчанию. Альтернативный вариант с использованием nextval('my_seq'::text) не создает
зависимости.
(regrole является исключением из этого правила. Константы этого типа не допускаются в хранимых выражениях.)
Другим типом идентификатора, используемым системой, является xid, или идентификатор
транзакции (сокращенно xact). Это тип данных системных столбцов
xmin и xmax. Идентификаторы транзакций представляют собой 32-разрядные величины.
В некоторых контекстах используется 64-разрядный вариант xid8 . В отличие от
xid значений, xid8 значения увеличиваются строго монотонно и не могут быть использованы повторно в течение всего времени существования кластера баз данных. См. Раздел 7.16.1 для получения более подробной информации.
Третий тип идентификаторов, используемый системой, — это cid, или
идентификатор команды. Данный тип данных используется для системных столбцов
cmin и cmax. Идентификаторы команд также являются 32-разрядными величинами.
Последний тип идентификаторов, используемый системой, — это tid, или идентификатор
кортежа (идентификатор строки). Данный тип данных используется для системного столбца
ctid. Идентификатор кортежа (TID) представляет собой пару
(номер блока, индекс кортежа внутри блока), определяющую
физическое местоположение строки внутри таблицы.
(Более подробно системные столбцы описаны в Раздел 2.2.6.)