注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天朝布衣田中码农参上

苦逼码农的点点滴滴,请多多指教!

 
 
 

日志

 
 
 
 

MySQL特有的INSERT语句末尾附加"ON DUPLICATE KEY UPDATE"的用法  

2017-07-27 12:01:09|  分类: Mysql |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
在MySQL中,如果在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE,那么执行插入后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值的话,则会在出现重复值的行执行后面的UPDATE;如果不会则插入新行。说白了,该附加语句,就是为了防止重复插入记录。
假设有一张表,如果里面没有这个记录,那么就相当于只是简单执行了插入。例如:

insert into site (id, name, url)values('1', '乐乐吧', 'http://www.593668.com')

ON DUPLICATE KEY UPDATE url='http://www.593668.com';

执行结果是:
MySQL特有的INSERT语句末尾附加ON DUPLICATE KEY UPDATE的用法 - sinsunson - 天朝布衣田中码农参上
那么这种时候我们修改下相关SQL:

insert into site (id, name, url)values('1', '乐乐吧', 'http://593668.com')

ON DUPLICATE KEY UPDATE url='http://593668.com';

执行结果则变为:
MySQL特有的INSERT语句末尾附加ON DUPLICATE KEY UPDATE的用法 - sinsunson - 天朝布衣田中码农参上
这里为什么会显示两条记录受到影响,就是因为Mysql确实执行了两个行为,一个是插入INSERT,然后发现有重复值就再执行UPDATE语句。所以说,这个语法主要适合场合就在于那些防止重复插入的场合。
那么接下来问题就来了,如果需要更新多行记录,又要如何做呢。这时候就需要使用VALUES()函数了,比如数据库中有如下记录。
MySQL特有的INSERT语句末尾附加ON DUPLICATE KEY UPDATE的用法 - sinsunson - 天朝布衣田中码农参上
可执行如下语句:

insert into site (id, name, url)values('1', '乐乐吧', 'http://www.593668.com'),

('2', '爱上吃喝', 'http://www.237h.com') ON DUPLICATE KEY UPDATE url=values(url);

同样达到效果:
MySQL特有的INSERT语句末尾附加ON DUPLICATE KEY UPDATE的用法 - sinsunson - 天朝布衣田中码农参上
当然如果有人要同时更新好多条记录多条字段,还可以使用如下语句:

insert into site (id, name, url)values('1', '乐乐吧1', '593668.com'),

('2', '爱上吃喝1', '237h.com') ON DUPLICATE KEY UPDATE url=values(url),name=values(name);

执行结果:
MySQL特有的INSERT语句末尾附加ON DUPLICATE KEY UPDATE的用法 - sinsunson - 天朝布衣田中码农参上
使用起来还是蛮方便的,但这里要提醒下,ON DUPLICATE KEY UPDATE只是MySQL的特有语法,并不是SQL标准语法,所以不要想着在其它数据库系统中也使用哦!

 
 

  评论这张
 
阅读(1)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017