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