今天在開發時候,存在這樣一個需求場景:需要擷取資料庫中的資料記錄,如果存在該記錄則更新該記錄中的某些字段值;如果查詢結果為空即不存在該記錄,則要插入一條新的紀錄;
接手過來的代碼子產品是這樣實作的:

先通過sql查詢資料,然後判斷是否為空,再去update或者insert~
然後就想去把代碼優化一下,了解到MySQL一條語句可以解決這個問題:ON DUPLICATE KEY UPDATE
該語句的文法如下:
INSERT INTO tablename(field1,field2, field3, ...) VALUES(value1, value2, value3, ...) ON DUPLICATE KEY UPDATE field1=value1,field2=value2, field3=value3, ...;
這個文法的目的是為了解決重複性,當資料庫中存在某個記錄時,執行這條語句會更新它,而不存在這條記錄時,會插入它。
該語句規則如下:如果你插入的記錄導緻一個UNIQUE索引或者primary key(主鍵)出現重複,那麼就會認為該條記錄存在,則執行update語句而不是insert語句,反之,則執行insert語句而不是更新語句。
得到了這個方法,果斷替換掉原有方法,代碼簡潔明了多了,如下:
原以為萬事大吉,搞定完事了。
結果自測時候發現了實際效果不跟預期結果一樣,經排查發現這個方法使用存在問題:
當操作的存在主鍵跟索引不一緻的情況時,比如表主鍵是id,索引是a_b;
該語句會先執行insert,判斷主鍵id是否存在重複,不存在則插入新資料;但這個時候如果a_b是有重複的,則該語句會正常執行(即不報錯)但是并不會更新資料或者插入新紀錄;
這種情況下,我們期待的資料更新就沒有如期進行,會造成嚴重的資料丢失問題!!!