Upsert
存在就更新、不存在就新增
01你是不是遇到這個 / THE SYMPTOM
我想存一筆資料:如果它已經存在就更新,沒有的話就新增。我現在的寫法是「先查有沒有、再決定 INSERT 還是 UPDATE」,但這樣兩步之間如果有人同時也在寫,就會撞在一起或重複。我想要一行搞定。
↑ 如果你點頭了,你要的關鍵字就是 Upsert。
02這是什麼 / DEFINITION
Upsert 是 update + insert 的合稱,指用單一原子操作達成「存在就更新、不存在就新增」,由資料庫在偵測到鍵衝突時自動改成更新,避免「先查再寫」兩步之間的競態與重複。
03什麼時候用 / WHEN TO USE
同步外部資料、計數器累加、儲存設定、寫入可能重複的記錄時。只要你會寫出「先 SELECT 看有沒有,再決定 INSERT 或 UPDATE」的程式,多半都該換成 upsert。
04怎麼跟 AI 說 / HOW TO ASK
直接複製這句、貼進 Claude Code / Cursor / Copilot / ChatGPT:
把這段「先查再決定 INSERT/UPDATE」的邏輯改成一句 upsert,用 INSERT ... ON CONFLICT (email) DO UPDATE(PostgreSQL/SQLite 語法),讓它依 email 衝突時自動改成更新。
05常見坑 / WATCH OUT
⚠ Upsert 靠「唯一鍵(unique key)衝突」來判斷存不存在,所以對應欄位一定要先有 UNIQUE 約束,否則不會觸發更新、反而插出重複列。語法各家不同:PostgreSQL/SQLite 用 ON CONFLICT、MySQL 用 ON DUPLICATE KEY UPDATE,別抄錯方言。
06相關的詞 / RELATED