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

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

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

xmin
Идентификатор (код операции) добавляющей транзакции для этой версии строки. (Версия строки — это отдельное состояние строки; каждое изменение создает новую версию той же логической строки).

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

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

cmax
Идентификатор команды в удаляющей транзакции или ноль.

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

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

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