【あっぷさーと】

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を合体させた造語だよ。どっちも一発でやってくれるんだ
← 用語集にもどる