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

  • tableoid OID таблицы, содержащей эту строку. Этот столбец особенно удобен для запросов, которые выбирают из секционированных таблиц или иерархий наследования, поскольку без него трудно сказать, из какой отдельной таблицы взята строка. Их tableoidможно объединить со oidстолбцом pg_classдля получения имени таблицы.
  • xmin Идентификатор (идентификатор транзакции) транзакции вставки для этой версии строки. (Версия строки — это отдельное состояние строки; каждое обновление строки создает новую версию строки для той же логической строки.)
  • cmin Идентификатор команды (начиная с нуля) в транзакции вставки.
  • xmax Идентификатор (идентификатор транзакции) удаляющей транзакции или ноль для восстановленной версии строки. Этот столбец может быть ненулевым в версии с видимой строкой. Обычно это указывает на то, что транзакция удаления еще не зафиксирована или попытка удаления была отменена.
  • cmax Идентификатор команды в удаляющей транзакции или ноль.
  • ctid Физическое расположение версии строки в ее таблице. Обратите внимание, что, хотя ctidможно использовать для очень быстрого поиска версии строки, строка ctidизменится, если она будет обновлена ​​или перемещена с помощью VACUUM FULL. Поэтому ctidбесполезен в качестве долгосрочного идентификатора строки. Для идентификации логических строк следует использовать первичный ключ.

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

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