アップサート
Linoffによる回答
は正しいですが、Postgres9.5の新しい「UPSERT」機能
によって少し簡略化できます。 (別名 MERGE
)。この新機能は、Postgresに<として実装されています。 code> INSERT ON CONFLICT
構文。
一意のインデックスの違反を明示的にチェックするのではなく、 ON CONFLICT
を許可することができます 句は違反を検出します。次に、何もしない
、つまり、 INSERT
への取り組みを放棄することを意味します UPDATE
をわざわざ試みることなく 。したがって、挿入できない場合は、次の行に移動します。
Linoffのコードと同じ結果が得られますが、 WHERE
は失われます 条項。
INSERT INTO bigtable(col1, … )
SELECT col1, …
FROM stagingtable st
ON CONFLICT idx_bigtable_col1_col2_col
DO NOTHING
;