


版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、mysql原生语句中save的写法汇总背景在平常的开发中,经常碰到这种更新数据的场景:先判 断某一数据在库表中是否存在,存在则update,不存在则insert 。女口果使用 hibernate ,它自带 saverorupdate 方法,用 起来很方便,但如使用原生 sql语句呢?新手最常见的写法是,先通过 select语句查询记录是 否存在,存在则使用update语句更新,不存在则使用insert 语句插入。但是这样做明显不够优雅,存在几个问题:?为了执行一次更新操作,却在程序中使用了两次sql查询语句,在系统负载比较大的情况下,性能还是会有影响 的。?代码中存在if else语句,明明干
2、了一件事,代码却很长。码农都是懒人,能把事情简单做的为啥要复杂做呢:)。那么问题来了,如何优雅的用sql语句实现 saverorupdate ?最近工作上也碰到类似更新数据的问题,写多了也开始觉得烦。记得 oracle 下有 merge的写法,就google 一下 mysql 的类似实现,整理如下:数据不存在则插入,存在则无操作插入,存在则无操作。它的实现逻辑是,当插入语句出现主 键冲突,或者唯一键冲突时,不抛出错误,直接忽略这条插 入语句。官网上的相关介绍如下:aif you use the ignore keyword, errors that occurwhile executing t
3、he insert statement are ignored. forexample, without ignore, a row that duplicates an existing unique index or primary key value in the table causes a duplicate-key error and the statement is aborted. with ignore, the row is discarded and no error occurs. ignored errors may generate warnings instead
4、, although duplicate-key errors do not.mysql官方文档中提供标准的语法:代码如下:insert ignoreinto tbl_namepartition (partition_name,)(col_name,)values | value (expr | default,),(.),.或者insert 语values代码如下:insert ignoreinto tbl_namepartition (partition_name,.)(col_name,.)select .可见除了多了个ignore关键字以外,跟一般 句并无区别。举个栗子:1. 建一张测
5、试用的表代码如下:create table 'test_tab' ('name' varchar(64) not null,'age' int(11) not null,primary key ('name')engine=innodb default charset=utf8;2. 插入一条数据代码如下:insert into 'test_tab' ('name','age')('zhangsan',24)当前test_tab表的数据为:代码如下:name|age:
6、-I:zhangsan|243. 再执行一次步骤2的插入语句,则会报异常:代码如下:err 1062 - duplicate entry 'zhangsan' for key'primary'4. 对步骤2的insert语句增加ignore关键字,则不会 报异常,已存在的数据也不会被更新。代码如下:insert ignore into 、test_tab' ('name','age')values ('zhangsan',24);语句执行情况:受影响的行:0时间:0.000s当前test_tab表的数据为:
7、代码如下:name|age:-I:zhangsan|24不存在则插入,存在则更新,其一(使用duplicate keyupdate 关键字)关键在 insert 语句中使用 on duplicate key update 字实现数据不存在则插入,存在则更新的操作。判断数据重 复的逻辑依然是主键冲突或者唯一键冲突。官网上的相关介绍如下:aif you specify on duplicate key update, and a rowis inserted that would cause a duplicate value in a unique index or primary key, a
8、n update of the old row is performed. the affected-rows value per row is 1 if the row is inserted as a new row, 2 if an existing row is updated, and 0 if an existing row is set to its current values.mysql官方文档中提供标准的语法:代码如下:insertinto tbl_namepartition (partition_name,.)(col_name,.)values | value (exp
9、r | default,on duplicate key updatecol_name=expr,col_name=expr .或者:代码如下:insertinto tbl_namepartition (partition_name,.)set col_name=expr | default, .on duplicate key update col_name=expr,col_name=expr .或者:代码如下:insertinto tbl_namepartition (partition_name,.)(col_name,.)select .on duplicate key update
10、col_name=expr,col_name=expr .可见,还是原来insert语句的写法。举个栗子:1. 使用刚才新建的test_tab 表,此时表中的数据如下:代码如下:name|age:-I:zhangsan|242. 使用主键相同的insert 语句,仍然会 duplicate key 错误代码如下:insert into 'test_tab' ('name','age') values('zhangsan',50);err 1062 - duplicate entry 'zhangsan' for k
11、ey'primary'3. 对刚才的insert 语句添加 on duplicate key update 关键字:代码如下:insert into 、test_tab' ('name','age') values ('zhangsan',50)on duplicate key update、age'=50 ;受影响的行:2时间:0.025s4. 此时主键为'zhangsan'的数据,age字段已被更新:代码如下:name|age:-I:zhangsan|505. 当然,如果主键不冲突,效果跟一般插
12、入语句是一样的:代码如下:insert into 、test_tab' ('name','age') values('lisi',30)on duplicate key update、age'=30 ;受影响的行:1时间:0.009s代码如下:name|age:-|:zhangsan|50lisi|30不存在则插入,存在则更新,其二(使用 replace语句实现)save or update 在 mysql中还有另一种实现, 即replace into 语句,它用起来有点像 oracle 的merge。判断数据重 复的逻辑依然是主
13、键或者唯一键冲突。mysql官方文档中提供标准的语法:代码如下:replace low_priority | delayedinto tbl_namepartition (partition_name,.)(col_name,.)values | value (expr | default,或:代码如下:replace low_priority | delayedinto tbl_namepartition (partition_name,.)set col_name=expr | default, .或:代码如下:replace low_priority | delayedinto tbl_
14、namepartition (partition_name,.)(col_name,.)select .举个栗子:1. 仍然使用上面的test_tab 表的数据,此时数据如下代码如下:name|age:-I:zhangsan|50lisi|302. 使用一般的insert 语句插入name=zhangsan的数据,报主键冲突。但是换成replace into语句则没问题:代码如下:replace into 'test_tab' ('name','age') values ('zhangsan',30);受影响的行:2时间:0.009s3. 结果如下: 代码如下:name|age:-I:zhangsan|30 lisi|30实现方式与 insert 的“ duplicate key update”关键字不同。当使用replace into语句时,对于重复的数据,是直接删除,然后再插入新数据的。所以它的更新其实不是 update,而是delete->insert。大多数情况下,使用replaceinto完成更新操作并无问题,但是有一种场景必须特别注意:?当被更新的表,存在insert ,update,和delete 触发器时,使用replace语句必
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年阳江市阳春市三上数学期末调研试题含解析
- 自考行政管理文化产业题及答案
- 护理理论在实际中的应用试题及答案
- 执业药师的法律法规理解试题及答案
- 精细化复习策略2025年执业医师考试试题及答案
- 2025年执业护士考试产科护理知识试题及答案
- 现代化进程中的文化冲突试题及答案
- 行政管理备考攻略试题及答案
- 主管护师考试可行性分析试题及答案
- 2025年行政管理运作理论试题及答案
- 回弹法测试原始记录表
- 律师评析:实际施工人诉讼案例
- 武术基本功五步拳 教案6篇
- 详解 强基计划
- 餐饮场所消防安全培训
- 乡村卫生室服务一体化管理工作制度
- 医学英语术语解密-福建医科大学中国大学mooc课后章节答案期末考试题库2023年
- 医用耗材采购简易流程图
- 第六章电力系统自动低频减载装置
- 新能源设计专业考试题库汇总(附答案)
- 微生物学(细胞型)知到章节答案智慧树2023年哈尔滨师范大学
评论
0/150
提交评论