「UPSERT」の版間の差分

ページの作成:「'''UPSERT'''(読み:あっぷさーと)とは、SQLにおいて「レコードがなければINSERT、あればUPDATE」という処理のこと指す英語で…」
 
 
(同じ利用者による、間の2版が非表示)
1行目: 1行目:
'''UPSERT'''(読み:あっぷさーと)とは、[[SQL]]において「レコードがなければINSERT、あればUPDATE」という処理のこと指す英語である。
'''UPSERT'''(読み:あっぷさーと)とは、[[SQL]]において「レコードがあればUPDATE、なければINSERT」という一連の処理のこと指すUPDATEとINSERTを超合金合体させた造語である。


== 概要 ==
== 概要 ==
5行目: 5行目:


# トランザクション開始
# トランザクション開始
# SELECT実行(+行ロック)
# SELECT実行(+[[行ロック]])
## レコードなければINSERT
## レコードなければINSERT
## レコードがあればUPDATE
## レコードがあればUPDATE
# トランザクション終了
# トランザクション終了


== サーバーでの実装 ==
ここ最近のデータベースサーバーでは[[SQL]]を独自拡張してUPSERTを1行で書けるようにしているものもある。
ここ最近のデータベースサーバーでは[[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 ===
また、ここ最近の[[ORM]]はデータベースサーバー側にUPSERT系命令が非搭載でも利用できるUPSERT命令を搭載していることが多い。煩雑な[[ソースコード]]を回避できる。
MERGE命令


=== 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
このため使用したい製品に関するUPSERT命令は「upsert 〇〇」などと[[ググって]]調べるのが得策である。
 
== ORMでの実装 ==
ここ最近のマイクロORMなんかでは、標準でUPSERT命令を搭載し、煩雑な[[ソースコード]]を回避できるようにしているものも多い。ほとんどのものはサーバーがUPSERT系命令を持っていなくても利用できる。