Insert, on duplicate update in PostgreSQL?UpsertがPostgreSQL 9.5+ UPSERTのアップデートであったかどうかを調べるには?
に記載したように書き込み可能のCTEは、次の書き込み可能なCTEをイディオムとUPDATEまたはINSERTとして終わったかどうかの情報でUPSERTを行うことが可能となる前に9.5にUPSERTを解決すると考えられた。
WITH
update_cte AS (
UPDATE t SET v = $1 WHERE id = $2 RETURNING 'updated'::text status
),
insert_cte AS (
INSERT INTO t(id, v) SELECT $2, $1 WHERE NOT EXISTS
(SELECT 1 FROM update_cte) RETURNING 'inserted'::text status
)
(SELECT status FROM update_cte) UNION (SELECT status FROM insert_cte)
このクエリは、「更新」または「挿入」、またはhttps://dba.stackexchange.com/questions/78510/why-is-cte-open-to-lost-updates
で説明したように(めったに)における制約違反で失敗しないことはPostgreSQL 9.5以降、新たな「UPSERT」を使用して似たような達成することができますいずれかを返します。構文、benefiその最適化から来て、可能性のある制約違反を避けていますか?
素敵なトリック**** – lad2025
ああ、それは醜いです!それは私のビジョンをぼやけさせる。 〜 – Patrick
あなたは 'xmax :: text :: int> 0'でトランザクションレベルの設定なしでこれを行うことができます(これは本当にオリジナルのハックです) –