広告スペース(バナー)
🗄️SQL レッスン
SELECTの基礎6
データ操作とサブクエリ5
構文の基本を深める7
応用的な条件・結合7
検索とテーブル操作の応用6
高度なクエリ技法6
集計とデータ整合性6
仕上げの機能と応用6
レッスン 34 / 50

UPSERT(INSERTとUPDATEを一度に行う)

このレッスンでは、UPSERTという「なければ追加、あれば更新」を1文で行う方法を学び、効率的なデータ登録処理を実現できるようになることを目標にします。「SQL UPSERT 使い方」で調べている方向けです。

INSERT ... ON CONFLICT DO UPDATEを使うと、「なければ追加、あれば更新」という処理を1つの文で行えます(これをUPSERTと呼びます)。在庫の入荷処理のように、既存データを積み増ししたいときに便利です。

サンプルコードでは、すでに存在するid = 1の商品に対して同じIDでINSERTを試み、ON CONFLICT(id) DO UPDATE SET stock = stock + excluded.stock;という指定で、競合が起きた場合は在庫数を加算する形で更新しています。excludedは「今回追加しようとした値」を指す特別なキーワードです。

初心者がよくつまずくのが、ON CONFLICTの対象となる列(この例ではid)には、あらかじめPRIMARY KEYのような一意性の制約が設定されている必要がある点です。この制約がないと、そもそも「競合」自体が発生しません。

本来なら「存在するか確認してから、追加か更新かを判断する」という複数の処理が必要ですが、UPSERTを使えば1回の操作で安全に済ませられ、処理の途中で他の変更が割り込む心配も減らせます。

SQL
OUTPUT / 実行結果

💡 初回実行時はSQLエンジンの読み込みに数秒かかります。

🎯
ここまでできればゴール達成!
データがあれば更新、なければ追加する処理が1つのクエリで書けるようになります。
広告スペース(バナー)
広告スペース(記事内)