mysql 原生语句中save 的写法汇总Word格式.docx
- 文档编号:21297731
- 上传时间:2023-01-29
- 格式:DOCX
- 页数:5
- 大小:16.88KB
mysql 原生语句中save 的写法汇总Word格式.docx
《mysql 原生语句中save 的写法汇总Word格式.docx》由会员分享,可在线阅读,更多相关《mysql 原生语句中save 的写法汇总Word格式.docx(5页珍藏版)》请在冰豆网上搜索。
那么问题来了,如何优雅的用sql语句实现saverorupdate?
最近工作上也碰到类似更新数据的问题,写多了也开始觉得烦。
记得oracle下有merge的写法,就google一下mysql的类似实现,整理如下:
数据不存在则插入,存在则无操作
在insert语句中使用ignore关键字实现数据不存在则插入,存在则无操作。
它的实现逻辑是,当插入语句出现主键冲突,或者唯一键冲突时,不抛出错误,直接忽略这条插入语句。
官网上的相关介绍如下:
“
ifyouusetheignorekeyword,errorsthatoccurwhileexecutingtheinsertstatementareignored.forexample,withoutignore,arowthatduplicatesanexistinguniqueindexorprimarykeyvalueinthetablecausesaduplicate-keyerrorandthestatementisaborted.withignore,therowisdiscardedandnoerroroccurs.ignorederrorsmaygeneratewarningsinstead,althoughduplicate-keyerrorsdonot.
”
mysql官方文档中提供标准的语法:
代码如下:
insertignore
intotbl_name
[partition(partition_name,...)]
[(col_name,...)]
{values|value}({expr|default},...),(...),...
或者
[into]tbl_name
select...
可见除了多了个ignore关键字以外,跟一般insert语句并无区别。
举个栗子:
1.建一张测试用的表
createtable`test_tab`(
`name`varchar(64)notnull,
`age`int(11)notnull,
primarykey(`name`)
)engine=innodbdefaultcharset=utf8;
2.插入一条数据
insertinto`test_tab`(`name`,`age`)values('
zhangsan'
24)
当前test_tab表的数据为:
name|age
:
—-|:
—
zhangsan|24
3.再执行一次步骤2的插入语句,则会报异常:
[err]1062-duplicateentry'
forkey'
primary'
4.对步骤2的insert语句增加ignore关键字,则不会报异常,已存在的数据也不会被更新。
insertignoreinto`test_tab`(`name`,`age`)values('
24);
------
语句执行情况:
受影响的行:
0
时间:
0.000s
不存在则插入,存在则更新,其一(使用duplicatekeyupdate关键字)
在insert语句中使用onduplicatekeyupdate关键字实现数据不存在则插入,存在则更新的操作。
判断数据重复的逻辑依然是主键冲突或者唯一键冲突。
官网上的相关介绍如下:
ifyouspecifyonduplicatekeyupdate,andarowisinsertedthatwouldcauseaduplicatevalueinauniqueindexorprimarykey,anupdateoftheoldrowisperformed.theaffected-rowsvalueperrowis1iftherowisinsertedasanewrow,2ifanexistingrowisupdated,and0ifanexistingrowissettoitscurrentvalues.
insert
[onduplicatekeyupdate
col_name=expr
[,col_name=expr]...]
或者:
setcol_name={expr|default},...
可见,还是原来insert语句的写法。
1.使用刚才新建的test_tab表,此时表中的数据如下:
2.使用主键相同的insert语句,仍然会duplicatekey错误
50);
------------
3.对刚才的insert语句添加onduplicatekeyupdate…关键字:
50)
onduplicatekeyupdate`age`=50;
2
0.025s
4.此时主键为'
的数据,age字段已被更新:
zhangsan|50
5.当然,如果主键不冲突,效果跟一般插入语句是一样的:
lisi'
30)
onduplicatekeyupdate`age`=30;
1
0.009s
lisi|30
不存在则插入,存在则更新,其二(使用replace语句实现)
saveorupdate在mysql中还有另一种实现,即replaceinto语句,它用起来有点像oracle的merge。
判断数据重复的逻辑依然是主键或者唯一键冲突。
mysql官方文档中提供标准的语法:
replace[low_priority|delayed]
或:
1.仍然使用上面的test_tab表的数据,此时数据如下
2.使用一般的insert语句插入name=zhangsan的数据,报主键冲突。
但是换成replaceinto…语句则没问题:
replaceinto`test_tab`(`name`,`age`)values('
30);
3.结果如下:
zhangsan|30
对于操作结果来说,很像是saveorupdate,但是实现方式与insert的“duplicatekeyupdate”关键字不同。
当使用replaceinto语句时,对于重复的数据,是直接删除,然后再插入新数据的。
所以它的更新其实不是update,而是delete->
insert。
大多数情况下,使用replaceinto完成更新操作并无问题,但是有一种场景必须特别注意:
•当被更新的表,存在insert,update,和delete触发器时,使用replace语句必须特别小心。
因为按照业务逻辑,更新完数据后,应该触发update触发器,但是使用replace语句的话,会触发delete和insert触发器,如果update触发器有一些特殊操作(比如记录操作日志)的话,使用replace会导致业务逻辑混乱。
所以当被更新表存在触发器的场景时,使用insert的“duplicatekeyupdate”关键字更合适。
以上就是本文所述的全部内容了,希望能让大家更好的理解mysql中的save和update语句。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- mysql 原生语句中save 的写法汇总 原生 语句 save 写法 汇总