[size=medium]
MySQL的插入语法提供了类似insertOrUpdate的语法,这种方式大部分存储系统都有类似的机制比如在Solr或者ElasticSearch中,如果主键一样的就更新,不一样就添加,只不过在数据库里可以是主键单个或多个字段,也可以是单个索引或多字段联合唯一索引,逻辑都一样。
比如表里面有id,age,name,address,score四个字段
联合唯一索引 是id+age+name(表里只有索引没有主键,后面单说)
向一张空表插入下面的数据
[/size]
[size=medium]
第一次,由于这条数据的联合唯一索引不存在,所以会触发insert,不会触发update:
第一次表记录总量:1
1,18,张三,洛阳,1
然后执行第二次,由于联合唯一索引存在,所以会触发update,不会触发insert
第二次表记录总量:1
1,18,王五,北京海淀,2
继续执行第三次,由于联合唯一索引在第二步的name修改了,所以不存在联合唯一索引,那么这次会触发insert,不会触发update
第三次表记录总量:2
1,18,王五,北京海淀,2
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回去。
[/size]
[b][color=green][size=large]
有什么问题可以扫码关注微信公众号:我是攻城师(woshigcs),在后台留言咨询。
技术债不能欠,健康债更不能欠, 求道之路,与君同行。
[/size][/color][/b]
[img]http://dl2.iteye.com/upload/attachment/0104/9948/3214000f-5633-3c17-a3d7-83ebda9aebff.jpg[/img]
MySQL的插入语法提供了类似insertOrUpdate的语法,这种方式大部分存储系统都有类似的机制比如在Solr或者ElasticSearch中,如果主键一样的就更新,不一样就添加,只不过在数据库里可以是主键单个或多个字段,也可以是单个索引或多字段联合唯一索引,逻辑都一样。
比如表里面有id,age,name,address,score四个字段
联合唯一索引 是id+age+name(表里只有索引没有主键,后面单说)
向一张空表插入下面的数据
[/size]
INSERT INTO person
(id,age,name,address,score)
VALUES( 1, 18 , '张三' ,'洛阳',1)
ON DUPLICATE KEY UPDATE
name='王五',
address='北京海淀'
score = score + 1
[size=medium]
第一次,由于这条数据的联合唯一索引不存在,所以会触发insert,不会触发update:
第一次表记录总量:1
1,18,张三,洛阳,1
然后执行第二次,由于联合唯一索引存在,所以会触发update,不会触发insert
第二次表记录总量:1
1,18,王五,北京海淀,2
继续执行第三次,由于联合唯一索引在第二步的name修改了,所以不存在联合唯一索引,那么这次会触发insert,不会触发update
第三次表记录总量:2
1,18,王五,北京海淀,2
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回去。
[/size]
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更新
[b][color=green][size=large]
有什么问题可以扫码关注微信公众号:我是攻城师(woshigcs),在后台留言咨询。
技术债不能欠,健康债更不能欠, 求道之路,与君同行。
[/size][/color][/b]
[img]http://dl2.iteye.com/upload/attachment/0104/9948/3214000f-5633-3c17-a3d7-83ebda9aebff.jpg[/img]