最近的業務中,有這樣一個需求:如果資料存在就更新,不存在就寫入,一般情況下是需要先查詢,後判斷是更新還是寫入的,需要進行兩次IO操作。是以為了減少同步時間,第一個思路是使用并發,第二種思路就是應該盡量減少請求MySQL的次數,這裡将講講第二種思路。
正常情況下實作:如果存在就更新,不存在就寫入的僞代碼:
// 僞代碼
user=User.FindById(1)
if user == null{
user.Insert()
}else{
user.Update()
}
需要先查詢,然後在通過if / else來進行插入或更新,是以總共需要進行兩次資料庫IO。
是以為了減少資料庫IO,可以使用如下方法:
1、replace into
replace into的作用是:如果資料已經存在了我就更新。如果資料不存在就更寫入。
而判斷資料是否已經存在的标準依然是:判斷唯一鍵是否重複。
Step1:這是用于做實驗的表資料

Step2:使用replace into插入一條主鍵已存在的資料:
可以看到replace into在這裡的作用是已存在則更新。
Step3:使用replace into插入一條主鍵不存在的資料:
可以看到,replace into在這裡的作用是不存在則寫入。
是以replace into是完全可以滿足我們的需求的。
2、on duplicate key update
這種方法也是可以實作如果存在就更新,不存在就寫入的需求,如下:
但是使用這個方法會有點缺陷:
官網中有描述:如果你每次使用on duplicate key update進行更新時(注意是更新而不是插入),MySQL也會讓last_insert_id變大。這就會出現id不連續增長的現象。