文档章节

MySQL的InsertOrUpdate语法

九劫散仙
 九劫散仙
发布于 2016/08/04 14:46
字数 749
阅读 160
收藏 2

MySQL的插入语法提供了类似insertOrUpdate的语法,这种方式大部分存储系统都有类似的机制比如在Solr或者ElasticSearch中,如果主键一样的就更新,不一样就添加,只不过在数据库里可以是主键单个或多个字段,也可以是单个索引或多字段联合唯一索引,逻辑都一样。

比如表里面有id,age,name,address,score四个字段

联合唯一索引 是id+age+name(表里只有索引没有主键,后面单说)

向一张空表插入下面的数据

INSERT INTO person 
(id,age,name,address,score)
VALUES( 1, 18 , '张三' ,'洛阳',1) 
ON DUPLICATE KEY UPDATE 
name='王五',
address='北京海淀'
score = score + 1

第一次,由于这条数据的联合唯一索引不存在,所以会触发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回去。

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更新

© 著作权归作者所有

九劫散仙
粉丝 268
博文 175
码字总数 189625
作品 0
海淀
私信 提问
mybatis 执行 INSERT … ON DUPLICATE KEY UPDATE

mybatis 在执行 INSERT … ON DUPLICATE KEY UPDATE 格式的语句的时候 没有报错,库表也没插入数据,数据库是mysql 用mysql客户端执行这条语句的时候却是能插入的 是因为myBatis不支持吗? ...

monologu
2015/03/13
11.6K
7
Mybatis-Plus 1.4.8 发布,mybatis crud 插件

Mybatis-Plus是一款MyBatis的增强 crud 工具包,简化 增 删 改 查 操作。启动加载 XML 配置时注入单表 SQL 操作 ,为简化开发工作、提高生产率而生。Mybatis-Plus 启动注入非拦截实现、性能更...

青苗
2016/10/13
4K
11
使用Hibernate注解实现实体类映射,遇到的持久化问题

A 类和B类是一对一关系,A的主键自增长,且作为B的外键和主键,执行insertorupdate(A)的时候出错,不能执行插入操作是怎么回事。

这不足为奇
2014/11/20
1K
9
MongoDB数据插入、删除、更新

1. MongoDB数据插入 MongoDB插入文档 // 插入语法db.[collectionName].insert({})// exampledb.sample.insert({name:"mongo"})1234 sample结果: 2. 批量插入文档 shell 这样执行是错误的 db......

xiaocao13140
2018/06/04
0
0
android SQLite InsertOrUpdate的使用

在SQL中,是支持insertOrUpdate的,但在android SQLite中并不支持了,那我们怎么办呢?很简单 比如有以下表结构: 其中,id是自动增长的索引,注意,现在很关键: 如果你想name值存在时,更新...

贺路的路
2013/07/03
3K
0

没有更多内容

加载失败,请刷新页面

加载更多

VMware vSphere ESXi主机的访问控制

在vShpere中,访问ESXi主机的途径很多,如下: ESXi DCUI ESXi Shell ESXi SSH ESXi Host Client vCenter --> vSphere web client / vSphere Client VMware vSphere ESXi主机的访问控制,除了......

大别阿郎
28分钟前
3
0
大神讲解CGI、FastCGI和PHP-FPM关系图解

参考资料 概念了解:CGI,FastCGI,PHP-CGI与PHP-FPM:http://www.nowamagic.net/librarys/veda/detail/1319 php中fastcgi和php-fpm是什么东西:https://www.zybuluo.com/phper/note/50231 ......

网络小虾米
38分钟前
3
0
《DNS攻击防范科普系列3》 -如何保障 DNS 操作安全

引言 前两讲我们介绍了 DNS 相关的攻击类型,以及针对 DDoS 攻击的防范措施。这些都是更底层的知识,有同学就来问能否讲讲和我们的日常操作相关的知识点,今天我们就来说说和我们日常 DNS 操...

Mr_zebra
38分钟前
3
0
zk中ServerCnxn

实现接口Stats, Watcher 内部类 DisconnectReason CloseRequestException EndOfStreamException(流关闭) 属性 方法 getSessionTimeout 获取session失效时间 sendResponse 发送回复数据 se......

writeademo
43分钟前
3
0
如何将 Redis 用于微服务通信的事件存储

来源:Redislabs 作者:Martin Forstner 翻译:Kevin (公众号:中间件小哥) 以我的经验,将某些应用拆分成更小的、松耦合的、可协同工作的独立逻辑业务服务会更易于构建和维护。这些服务(也...

中间件小哥
46分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部