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更新
相关文章
相关标签/搜索