MySQL的插入語法提供了相似insertOrUpdate的語法,這種方式大部分存儲系統都有相似的機制好比在Solr或者ElasticSearch中,若是主鍵同樣的就更新,不同就添加,只不過在數據庫裏能夠是主鍵單個或多個字段,也能夠是單個索引或多字段聯合惟一索引,邏輯都同樣。數據庫
好比表裏面有id,age,name,address,score四個字段code
聯合惟一索引 是id+age+name(表裏只有索引沒有主鍵,後面單說)索引
向一張空表插入下面的數據ast
INSERT INTO person (id,age,name,address,score) VALUES( 1, 18 , '張三' ,'洛陽',1) ON DUPLICATE KEY UPDATE name='王五', address='北京海淀' score = score + 1
第一次,因爲這條數據的聯合惟一索引不存在,因此會觸發insert,不會觸發update:date
1,18,張三,洛陽,1語法
而後執行第二次,因爲聯合惟一索引存在,因此會觸發update,不會觸發insert數據
1,18,王五,北京海淀,2co
繼續執行第三次,因爲聯合惟一索引在第二步的name修改了,因此不存在聯合惟一索引,那麼此次會觸發insert,不會觸發update系統
1,18,王五,北京海淀,2arc
1,18,張三,洛陽,1
最後執行第四次,這條SQL,因爲惟一索引存在了,因此會觸發update,可是在update的時候,發現已經有條數據了,因此會update失敗,既此次不會對錶的數據產生任何影響
1,18,王五,北京海淀,2
1,18,張三,洛陽,1
上面的聯合惟一索引是id+age+name,若是其中某一個或或多個字段是惟一索引的同時,又是主鍵,那麼更新的時候會優先以主鍵爲準,判斷聯合主鍵是否存在,若是存在就更新,不存在就判斷聯合惟一索引是否存在,若是存在則更新,不然就添加,這一點須要注意
執行insert或者update時,能夠使用批量處理模式,以下面的語句,若是表裏原來存在數據,那麼久更新,更新的內容等於從VALUES取出來的,若是有累加的,score=score+1會把原來記錄裏面的值取出來而後+1在update回去。
INSERT INTO person (id,age,name,address,score) VALUES( 1, 18 , '張三' ,'洛陽',1) VALUES( 2, 20 , '張三2' ,'邯鄲',2) VALUES( 3, 30 , '張三3' ,'朝陽',3) VALUES( 4, 25 , '張三4' ,'濟南',4) ON DUPLICATE KEY UPDATE name= VALUES(name)//從插入的值裏面獲取到,而後更新到新的列裏面 ,address=VALUES(address)//從插入的值裏面獲取到,而後更新到新的列裏面 , score = score + 1//不加values表明從數據庫已經存在的記錄裏面獲取值而後+1更新