「UPSERT」の版間の差分
ナビゲーションに移動
検索に移動
Administrator (トーク | 投稿記録) (ページの作成:「'''UPSERT'''(読み:あっぷさーと)とは、SQLにおいて「レコードがなければINSERT、あればUPDATE」という処理のこと指す英語で…」) |
Administrator (トーク | 投稿記録) (→概要) |
||
(同じ利用者による、間の2版が非表示) | |||
1行目: | 1行目: | ||
− | '''UPSERT'''(読み:あっぷさーと)とは、[[SQL]] | + | '''UPSERT'''(読み:あっぷさーと)とは、[[SQL]]において「レコードがあればUPDATE、なければINSERT」という一連の処理のこと指すUPDATEとINSERTを超合金合体させた造語である。 |
== 概要 == | == 概要 == | ||
5行目: | 5行目: | ||
# トランザクション開始 | # トランザクション開始 | ||
− | # | + | # 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 | ||
− | + | また、ここ最近の[[ORM]]はデータベースサーバー側にUPSERT系命令が非搭載でも利用できるUPSERT命令を搭載していることが多い。煩雑な[[ソースコード]]を回避できる。 | |
− | |||
− | + | UPSERT命令の名称はSQLにしろ ORMにしろ統一されていないのが特徴である。 | |
− | + | ざっくり何個かのORMを調べただけでも全部名称が異なっている。 | |
+ | * Merge | ||
+ | * InsertOrUpdate | ||
+ | * Save | ||
+ | * SaveChanges | ||
− | + | このため使用したい製品に関するUPSERT命令は「upsert 〇〇」などと[[ググって]]調べるのが得策である。 | |
− | |||
− | |||
− |
2020年5月15日 (金) 00:57時点における最新版
UPSERT(読み:あっぷさーと)とは、SQLにおいて「レコードがあればUPDATE、なければINSERT」という一連の処理のこと指すUPDATEとINSERTを超合金合体させた造語である。
概要[編集 | ソースを編集]
INSERT or UPDATEは非常に煩雑な処理である。
- トランザクション開始
- SELECT実行(+行ロック)
- レコードなければINSERT
- レコードがあればUPDATE
- トランザクション終了
ここ最近のデータベースサーバーではSQLを独自拡張してUPSERTを1行で書けるようにしているものもある。
- SQL Server = MERGE命令
- MySQL = INSERT ... ON DUPLICATE KEY UPDATE 構文
また、ここ最近のORMはデータベースサーバー側にUPSERT系命令が非搭載でも利用できるUPSERT命令を搭載していることが多い。煩雑なソースコードを回避できる。
UPSERT命令の名称はSQLにしろ ORMにしろ統一されていないのが特徴である。 ざっくり何個かのORMを調べただけでも全部名称が異なっている。
- Merge
- InsertOrUpdate
- Save
- SaveChanges
このため使用したい製品に関するUPSERT命令は「upsert 〇〇」などとググって調べるのが得策である。