Что это делает в Postgresql: xmax::text::int › 0

В чем смысл и цель следующего утверждения в Postgres:

xmax::text::int > 0

Это похоже на приведение к тексту, а затем повторное приведение к целому числу ???


person Jimski    schedule 01.04.2018    source источник
comment
Казалось бы, это то, что он делает. Я ожидаю, что либо xmax > 0, либо xmax::int > 0 будут эквивалентны.   -  person Gordon Linoff    schedule 01.04.2018
comment
Иногда вы не можете напрямую преобразовать один тип в другой (особенно с пользовательскими типами), поэтому вам нужно сначала привести к тексту, а затем к нужному типу.   -  person 404    schedule 01.04.2018
comment
xmax::text::int это потому, что xmax имеет тип xid, который не может быть напрямую преобразован в значение integer (см. приводит или где-то) Смысл этого условия: row was updated. Есть действительно отличный ответ с объяснением по теме: stackoverflow.com/a/39204667/593144   -  person Abelisto    schedule 01.04.2018


Ответы (1)


Каждая таблица в Postgres имеет несколько системных столбцов. являются нестандартными, специфическими функциями Postgres, для использования которых требуются базовые знания о внутреннем устройстве Postgres.

Столбец xmax по существу содержит 0 или некоторый номер транзакции. Однако это значение нельзя сравнивать напрямую с числами, поскольку столбец имеет тип xid, для которого не определены соответствующие операторы. По этой причине необходимо использовать литье.

Сравнение также можно записать в виде

xmax::text <> '0'

Смысл выражения можно понять из описания столбца:

хмакс

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

person klin    schedule 01.04.2018
comment
Это объясняет xmax::text, но для чего ::int? Зачем использовать двойное приведение, а не просто max::int ‹› '0' - person Jimski; 01.04.2018
comment
@Jimski Из ответа выше: This value can not be however directly compared to numbers, because the column is of type xid, for which no corresponding operators have been defined. Все (?) может быть приведено к тексту, следовательно, преобразование в текст, а затем преобразование в целое число. - person 404; 01.04.2018