メインメニューを開く

差分

UPSERT

315 バイト追加, 2020年5月15日 (金) 00:57
'''UPSERT'''(読み:あっぷさーと)とは、[[SQL]]において「レコードがなければINSERT、あればUPDATE」という処理のこと指す英語である。において「レコードがあればUPDATE、なければINSERT」という一連の処理のこと指すUPDATEとINSERTを超合金合体させた造語である。
== 概要 ==
# トランザクション開始
# SELECT実行(+行ロック)SELECT実行(+[[行ロック]])
## レコードなければINSERT
## レコードがあればUPDATE
# トランザクション終了
== サーバーでの実装 ==
ここ最近のデータベースサーバーでは[[SQL]]を独自拡張してUPSERTを1行で書けるようにしているものもある。
* SQL Server = MERGE命令
* MySQL = INSERT ... ON DUPLICATE KEY UPDATE 構文
*: https://dev.mysql.com/doc/refman/5.6/ja/insert-on-duplicate.html
=== SQL Server ===MERGE命令また、ここ最近の[[ORM]]はデータベースサーバー側にUPSERT系命令が非搭載でも利用できるUPSERT命令を搭載していることが多い。煩雑な[[ソースコード]]を回避できる。
=== MySQL ===UPSERT命令の名称はSQLにしろ ORMにしろ統一されていないのが特徴である。INSERT ... ON DUPLICATE KEY UPDATE 構文ざっくり何個かのORMを調べただけでも全部名称が異なっている。* Merge* InsertOrUpdate* Save* SaveChanges
* https://dev.mysql.com/doc/refman/5.6/ja/insert-on-duplicate.html == ORMでの実装 ==ここ最近のマイクロORMなんかでは、標準でUPSERT命令を搭載し、煩雑なこのため使用したい製品に関するUPSERT命令は「upsert 〇〇」などと[[ソースコードググって]]を回避できるようにしているものも多い。ほとんどのものはサーバーがUPSERT系命令を持っていなくても利用できる。調べるのが得策である。