Skip to content

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