免責事項:理論的な質問。PostgreSQL Upsertは、システム列XMIN、XMAXなどを使用して、挿入され更新された行を区別します。
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
の列hereの意味をあまりにも明確に説明していません。
ロジックをこれらの列に基づいてベースにすることはできますか?システム列(ソースコードを除く)に関する重要な説明はありますか?
最後に、更新/挿入された行についての私の推測は正しいですか?
更新中に設定したメタデータの別の列を作成しないでください。 – vol7ron
@ vol7ronクエリ全体が遅くなっているためです。私は、既存の列(システム列を含む)が十分であると感じています。興味深いもの: – Abelisto
私の直感はそれがうまくいくと言いますが、それは文書化されていない行動であり、いつか変わらないという保証はありません。私はプロのプロジェクトでこれを使うのではないでしょう。 – klin