[解決済み] Postgresqlで「挿入無視」と「重複キー更新」(SQLマージ)をエミュレートする方法は?
2022-04-21 09:39:31
質問
一部のSQLサーバーでは
INSERT
は、主キー/ユニークキー制約に違反する場合はスキップされます。たとえば、MySQL では
INSERT IGNORE
.
をエミュレートするのに最適な方法は何ですか?
INSERT IGNORE
と
ON 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回記述する必要はありません)。
関連
-
PostgreSQLにおけるVACUUMコマンドの使用方法
-
[解決済み] PostgreSQLで重複して更新された場合の挿入?
-
[解決済み] PostgreSQLで更新+結合を行うには?
-
[解決済み] PostgreSQLで一重引用符で囲まれたテキストを挿入する
-
[解決済み] PostgreSQLの場合。PostgreSQLですべてのテーブルのOWNERを同時に変更する
-
[解決済み] Postgresqlで見出し付きのテーブルをCSVで出力する方法は?
-
[解決済み] Postgres 9.4でJSONB型のカラムに対して更新操作を実行する方法
-
[解決済み] PostgreSQLでカラムのデフォルト値を変更するにはどうすればよいですか?
-
[解決済み】PostgreSQLでUPSERT(MERGE、INSERT ... ON DUPLICATE UPDATE)する方法とは?
-
[解決済み] PostgreSQLでソートしながら固定数の行を削除するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
エクセルテーブルのデータをpostgresqlのデータベースにインポートする方法
-
GROUP BY句での定数使用に関するPostgreSQLの特別な制限について説明します。
-
[解決済み] Splunk : ユニークフィールドを使用したレコードの重複排除
-
[解決済み] MySQLで'insert if not exists'を行うにはどうしたらいいですか?
-
[解決済み] PostgreSQLで重複して更新された場合の挿入?
-
[解決済み] コマンドライン引数でPostgreSQLの.sqlファイルを実行する
-
[解決済み] Postgresqlで「大文字小文字を区別しない」クエリを作成する方法は?
-
[解決済み] Postgresqlで見出し付きのテーブルをCSVで出力する方法は?
-
[解決済み] Postgresqlの場合。パスワード付きで psql を実行するスクリプト
-
[解決済み] Postgres / PostgreSQLのテーブルとインデックスのディスクサイズはどのように見つけるのですか?