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 бесполезен в качестве долгосрочного идентификатора строки. Для идентификации логических строк следует использовать первичный ключ.

Идентификаторы транзакций также являются 32-битными значениями. В долгоживущей базе данных возможно оборачивание идентификаторов транзакций. Это не является критической проблемой при соответствующих процедурах обслуживания; см. Глава 23 для получения подробной информации. Однако неразумно полагаться на уникальность идентификаторов транзакций в долгосрочной перспективе (более одного миллиарда транзакций).

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