Отказ от ответственности: теоретический вопрос.
Было задано несколько вопросов о том, как отличать вставленные и обновленные строки в инструкции PostgreSQL upsert
.
Вот простой пример:
[email protected]=# create table t(i int primary key, x int);
[email protected]=# insert into t values(1,1);
[email protected]=# insert into t values(1,11),(2,22)
on conflict(i) do update set x = excluded.i*11
returning *, xmin, xmax;
╔═══╤════╤══════╤══════╗
║ i │ x │ xmin │ xmax ║
╠═══╪════╪══════╪══════╣
║ 1 │ 11 │ 7696 │ 7696 ║
║ 2 │ 22 │ 7696 │ 0 ║
╚═══╧════╧══════╧══════╝
Итак, xmax
> 0 (или xmax
= xmin
) - строка обновлена; xmax
= 0 - строка была вставлена.
IMO Непонятно объяснять значения столбцов xmin
и xmax
здесь.
Можно ли основывать логику на этих столбцах? Есть ли более существенное объяснение системных столбцов (кроме исходного кода)?
И, наконец, моя догадка о обновленных/вставленных строках?