9月 22, 2014

SQL UPSERT 語法

在 SQL 中的 UPSERT 語法指的是:若資料不存在則新增一筆,否則更新已存在資料。原文見維基百科 Merge (SQL)條目
A relational database management system uses SQL MERGE (also called upsert) statements to INSERT new records or UPDATE existing records depending on whether or not a condition matches.
在 MySQL 實作語法為 INSERT ... ON DUPLICATE KEY UPDATE
實際用法:
INSERT INTO table (IDX, IPAddr, Msg, Status)
VALUES ('1', '127.0.0.1', 'foorbar', 'UNSENT')
ON DUPLICATE KEY UPDATE Status = 'SENT'
說明:
  • 若記錄不存在,則新增一筆 (1, 127.0.0.1, 'foorbar', 'UNSENT') 
  • 如果原記錄存在,修正更新為 (1, 127.0.0.1, 'foorbar', 'SENT')
針對資料列存在與否,不須仰賴其他程式進行判斷,直接透過 SQL 處理。若資料列不存在,則進行插入(INSERT)動作,否則進行更新(UPDATE)動作。

實例更新(Jan. 22, 2018):

資料表 daily_transaction 結構 ( idx, date, qty, amount )
  • idx 為主鍵自動遞增(AUTO INCREMENT)
  • date 為唯一鍵(UNIQUE key)
  • qty 代表件數、amount 代表總金額
在此例中只在乎日期(date)是否存在、不管 idx 值;存在則更新資料,否則插入資料:
INSERT INTO daily_transaction (date, qty, amount)  //date 是唯一鍵
VALUES('1070122', '168', '368100')
ON DUPLICATE KEY UPDATE qty='168', amount='368100';

沒有留言:

張貼留言