5.5. Системные столбцы#

5.5. Системные столбцы

5.5. Системные столбцы

Каждая таблица имеет несколько системных столбцов, которые неявно определены системой. Поэтому их имена не могут использоваться в качестве имен для пользовательских столбцов. (Обратите внимание, что не важно, является ли имя ключевым словом или нет; заключение имени в кавычки не позволит избежать этих ограничений). Не нужно беспокоиться об этих столбцах; просто знайте, что они существуют.

tableoid

OID таблицы, содержащей данную строку. Этот столбец особенно удобен для запросов, работающих с секционированными таблицами (см. Раздел 5.11) или иерархий наследования (см. Раздел 5.10), поскольку без него сложно определить, из какой конкретно таблицы выбрана строка. Столбец tableoid может быть объединен с столбцом oid pg_class для получения имени таблицы.

xmin

Идентификатор (ID) транзакции, вставившей строку этой версии. (Версия строки - это отдельное состояние строки; каждое обновление строки создает новую версию строки одной и той же логической строки).

cmin

Идентификатор команды (начиная с нуля) внутри транзакции, вставившей строку.

xmax

Идентификатор (ID) транзакции, удалившей строку, или ноль для неудаленной версии строки. Значение данного столбца может быть ненулевым и для видимой версии строки. Обычно это указывает на то, что транзакция, удалившая строку, еще не подтверждена или что попытка удаления была отменена.

cmax

Идентификатор команды в рамках транзакции, удалившей строку, или ноль.

ctid

Физическое расположение версии строки внутри таблицы. Обратите внимание, что хотя ctid можно использовать для быстрого определения версии строки, ctid изменится, если строка будет обновлена или перемещена с помощью VACUUM FULL. Поэтому ctid бесполезен в качестве долгосрочного идентификатора строки. Для идентификации логических строк следует использовать первичный ключ.

В Tantor SE-1С идентификаторы транзакций реализованы в виде 64-битных счетчиков, чтобы предотвратить зацикливание идентификаторов транзакций. Подробности см. в Раздел 23.1.5.2.

Идентификаторы команд также являются 32-битными величинами. Это создает жесткое ограничение в 232 (4 миллиарда) SQL команд в рамках одной транзакции. На практике это ограничение не является проблемой — обратите внимание, что ограничение касается количества SQL команд, а не количества обработанных строк. Кроме того, только командам, которые фактически изменяют содержимое базы данных, присваивается идентификатор команды.