UPSERT

リレーショナルデータベース(RDB)を操作するSQLでは、レコードを追加する際にINSERT文を、既存レコードを書き換える際にUPDATE文を用いる。本来は対象データの有無を事前に判定し、両者を使い分ける必要がある。
実際の運用では、データが初回登録か更新かをいちいち確認する手間を省きたい場面が少なくない。UPSERTはこの判定と登録・更新の処理を一つの命令にまとめたものである。利用者情報や商品情報、在庫数など、同じ識別子を持つデータを繰り返し登録する場面で利用される。
UPSERTは、主キーや一意制約(UNIQUE制約)によってレコードの重複を判定し、競合が発生した場合に更新へ切り替える。同じデータを重複して登録することを防ぎながら、最新の内容へ効率良く更新できる。アプリケーション側で存在確認のための問い合わせを別途発行する必要がなくなるため、通信や処理の無駄を省くことにも繋がる。
「UPSERT」という構文を備える処理系はあまりなく、既存の構文を拡張する形でこの機能が提供されることが一般的である。PostgreSQLとSQLiteでは「INSERT … ON CONFLICT DO UPDATE」という構文を、MySQLでは「INSERT … ON DUPLICATE KEY UPDATE」という構文を用いる。また、SQL標準に含まれる「MERGE」文を使い、条件に応じてINSERTとUPDATEを切り分ける方法を採用するシステムもある。
RDB以外では、米オラクル(Oracle)社が提供するNoSQLデータベース向けのSQL風言語「SQL for Oracle NoSQL Database」に、UPSERT文がそのままの名称で用意されている。クラウド型のデータベースサービスやNoSQL製品の中にも、UPSERT相当の操作をAPIやコマンドの形で提供するものが多く、データ同期やバッチ処理を扱うアプリケーション開発などで使われている。