MySQL的InsertOrUpdate語法

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

1,18,張三,洛陽,1語法

而後執行第二次,因爲聯合惟一索引存在,因此會觸發update,不會觸發insert數據

第二次表記錄總量:1

1,18,王五,北京海淀,2co

繼續執行第三次,因爲聯合惟一索引在第二步的name修改了,因此不存在聯合惟一索引,那麼此次會觸發insert,不會觸發update系統

第三次表記錄總量:2

1,18,王五,北京海淀,2arc

1,18,張三,洛陽,1

最後執行第四次,這條SQL,因爲惟一索引存在了,因此會觸發update,可是在update的時候,發現已經有條數據了,因此會update失敗,既此次不會對錶的數據產生任何影響

第四次表記錄總量:2

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更新
相關文章
相關標籤/搜索