mysql 原生语句中save 的写法汇总Word格式.docx

上传人:b****5 文档编号:21297731 上传时间:2023-01-29 格式:DOCX 页数:5 大小:16.88KB
下载 相关 举报
mysql 原生语句中save 的写法汇总Word格式.docx_第1页
第1页 / 共5页
mysql 原生语句中save 的写法汇总Word格式.docx_第2页
第2页 / 共5页
mysql 原生语句中save 的写法汇总Word格式.docx_第3页
第3页 / 共5页
mysql 原生语句中save 的写法汇总Word格式.docx_第4页
第4页 / 共5页
mysql 原生语句中save 的写法汇总Word格式.docx_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

mysql 原生语句中save 的写法汇总Word格式.docx

《mysql 原生语句中save 的写法汇总Word格式.docx》由会员分享,可在线阅读,更多相关《mysql 原生语句中save 的写法汇总Word格式.docx(5页珍藏版)》请在冰豆网上搜索。

mysql 原生语句中save 的写法汇总Word格式.docx

  那么问题来了,如何优雅的用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语句。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 中考

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1