【あっぷさーと】

UPSERT とは?

公開:
💡 あれば更新、なければ追加!一石二鳥のお手軽操作
📌 このページのポイント
UPSERT = UPDATE + INSERT UPSERT データ投入 データが存在する場合 ID=1 太郎(既存) UPDATE で更新 データが存在しない場合 ID=2 該当なし INSERT で新規挿入
UPSERTのイメージ
ひよこ ひよこ
UPSERTって変わった名前だね!UPDATEとINSERTが合体したのかな?
ペンギン先生 ペンギン先生
その通り!UPDATEとINSERTを合わせた造語だよ。データがあれば更新して、なければ新規挿入する、という処理を一つのSQL文で実行できるんだ
ひよこ ひよこ
普通にIF文で分岐すればいいんじゃないの?
ペンギン先生 ペンギン先生
アプリケーション側でSELECTして存在チェック→INSERT or UPDATEとやると、チェックと実行の間に別の処理が割り込む可能性があるんだ。UPSERTならデータベースがアトミックに処理してくれるから安全だよ
ひよこ ひよこ
具体的にはどう書くの?
ペンギン先生 ペンギン先生
PostgreSQLなら INSERT INTO users (id, name) VALUES (1, '太郎') ON CONFLICT (id) DO UPDATE SET name = '太郎' という感じだよ。MySQLなら ON DUPLICATE KEY UPDATE を使うんだ
ひよこ ひよこ
どんなときに使うことが多いの?
ペンギン先生 ペンギン先生
外部データの定期取り込みや、設定値の保存なんかでよく使うよ。たとえばユーザーのプロフィール更新は「初回は挿入、2回目以降は更新」だから、まさにUPSERTの出番だね
ひよこ ひよこ
SQLiteでも使えるのかな?
ペンギン先生 ペンギン先生
SQLiteでも INSERT OR REPLACE や ON CONFLICT 句が使えるよ。ただし REPLACE は既存行を削除して再挿入する動きだから、外部キーや自動採番に影響することがある。ON CONFLICT DO UPDATE の方が安全だね
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「UPSERT」って出てきたら「あれば更新、なければ挿入する便利なDB操作」と思えればだいたいOK!
📖 おまけ:英語の意味
「UPSERT (UPDATE + INSERT)」 = 更新+挿入
💬 UPDATEとINSERTを合体させた造語だよ。どっちも一発でやってくれるんだ
← 用語集にもどる