Документация по PostgreSQL 9.4.1 | |||
---|---|---|---|
Пред. | Уровень выше | Глава 5. Определение данных | След. |
5.4. Системные колонки
В каждой таблице есть несколько системных колонок, неявно определённых системой. Как следствие, их имена нельзя использовать в качестве имён пользовательских колонок. (Заметьте, что это не зависит от того, является ли имя ключевым словом или нет; заключение имени в кавычки не поможет избежать этого ограничения.) Эти колонки не должны вас беспокоить, вам лишь достаточно знать об их существовании.
- oid
Идентификатор объекта (object ID) для строки. Эта колонка присутствует, только если таблица была создана с указанием WITH OIDS, или если в момент её создания была установлена переменная конфигурации default_with_oids. Эта колонка имеет тип oid (с тем же именем, что и сама колонка); подробнее об этом типе см. Раздел 8.18.
- tableoid
Идентификатор объекта для таблицы, содержащей строку. Эта колонка особенно полезна для запросов, имеющих дело с иерархией наследования (см. Раздел 5.8), так как без неё сложно определить, из какой таблицы выбрана строка. Связав tableoid с колонкой oid в таблице pg_class, можно будет получить имя таблицы.
- xmin
Идентификатор (код) транзакции, добавившей строку этой версии. (Версия строки — это её индивидуальное состояние; при каждом изменении создаётся новая версия одной и той же логической строки.)
- cmin
Номер команды (начиная с нуля) внутри транзакции, добавившей строку.
- xmax
Идентификатор транзакции, удалившей строку, или 0 для неудалённой версии строки. Значение этой колонки может быть ненулевым и для видимой версии строки. Это обычно означает, что удаляющая транзакция ещё не была зафиксирована, или удаление было отменено.
- cmax
Номер команды в удаляющей транзакции или ноль.
- ctid
Физическое расположение данной версии строки в таблице. Заметьте, что хотя по ctid можно очень быстро найти версию строки, значение ctid изменится при выполнении VACUUM FULL. Таким образом, ctid нельзя применять в качестве долгосрочного идентификатора строки. Для идентификации логических строк лучше использовать OID или даже дополнительный последовательный номер.
Коды OID представляют собой 32-битные значения и выбираются из единого для всей СУБД счётчика. В больших или долгоживущих базах данных этот счётчик может пойти по кругу. Таким образом, не рекомендуется рассчитывать на уникальность OID, если только вы не обеспечите её дополнительно. Если вам нужно идентифицировать строки таблицы, настоятельно рекомендуется использовать последовательности. Однако можно использовать и коды OID, при выполнении следующих условий:
Когда для идентификации строк таблиц применяется OID, в каждой такой таблице должно создаваться ограничение уникальности для колонки OID. Когда такое ограничение уникальности (или уникальный индекс) существует, система позаботится о том, чтобы OID новой строки не совпал с уже существующими. (Конечно, это возможно, только если в таблице меньше 232 (4 миллиардов) строк, а на практике таблицы должны быть гораздо меньше, иначе может пострадать производительность системы.)
Никогда не следует рассчитывать, что OID будут уникальны среди всех таблиц; в качестве глобального идентификатора в рамках базы данных используйте комбинацию tableoid и OID строки.
Конечно, все эти таблицы должны быть созданы с указанием WITH OIDS. В PostgreSQL 8.1 и новее по умолчанию подразумевается WITHOUT OIDS.
Идентификаторы транзакций также являются 32-битными. В долгоживущей базе данных они могут пойти по кругу. Это не критично при правильном обслуживании БД; подробнее об этом см. Главу 23. Однако полагаться на уникальность кодов транзакций в течение длительного времени (при более чем миллиарде транзакций) не следует.
Идентификаторы команд также 32-битные. Это создаёт жёсткий лимит на 232 (4 миллиарда) команд SQL в одной транзакции. На практике это не проблема — заметьте, что это лимит числа команд SQL, а не количества обрабатываемых строк. Кроме того, идентификатор получают только те команды, которые фактически изменяют содержимое базы данных.
Пред. | Начало | След. |
Ограничения | Уровень выше | Изменение таблиц |