1. ホーム
  2. postgresql

[解決済み] Postgresqlで「挿入無視」と「重複キー更新」(SQLマージ)をエミュレートする方法は?

2022-04-21 09:39:31

質問

一部のSQLサーバーでは INSERT は、主キー/ユニークキー制約に違反する場合はスキップされます。たとえば、MySQL では INSERT IGNORE .

をエミュレートするのに最適な方法は何ですか? INSERT IGNOREON DUPLICATE KEY UPDATE をPostgreSQLで使うのですか?

解決方法は?

UPDATEを実行してみてください。行が変更されないということは、その行が存在しなかったということなので、挿入を実行してください。もちろん、これはトランザクションの中で行ってください。

もちろん、クライアント側に余分なコードを置きたくなければ、これを関数でラップすることができます。その場合、ごく稀に発生するレースコンディションのためにループが必要になります。

ドキュメントにその例があります。 http://www.postgresql.org/docs/9.3/static/plpgsql-control-structures.html 右下の例40-2。

通常はこれが一番簡単な方法です。ルールを使って魔法をかけることもできますが、かなり面倒なことになりそうです。私はいつでも、ラップインファンクションアプローチをお勧めします。

これは1行、または数行の値に対して有効です。サブクエリで大量の行を処理する場合は、INSERTとUPDATEの2つのクエリに分けるのがベストです(もちろん、適切なjoin/subselectを使用します - メインフィルタを2回記述する必要はありません)。