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 идентификаторы транзакций реализованы в виде 64-битных счетчиков, чтобы предотвратить зацикливание идентификаторов транзакций. Подробности см. в Раздел 24.1.5.2.

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