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