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