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

天朝布衣田中码农参上

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

 
 
 

日志

 
 
 
 

MySQL特有语句INSERT INTO .. ON DUPLICATE KEY UPDATE ..  

2017-10-10 11:38:04|  分类: Mysql |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
大家可能已经习惯用MYSQL中REPLACE INTO语句来批量更新数据[此语句的好处是在于,可以不用判断原数据是否存在,前提是表中必须有主键,即唯一索引],但是用这个语句也会产生一个问题,即如果给的字段值不全的话,它直接删除旧值再INSERT新值并将其它没有给的字段置成默认值,这样就会带来一个数据丢失的麻烦。尤其是一些情况下,只需要更新一个字段,但每次都要将相关的表字段值都提交,大大地增加了工作量。
那么为了解决这个问题,使用INSERT INTO .. ON DUPLICATE KEY也许会是一个比较好的办法,此语句的作用就是,如果发现插入的数据表中已经有相同key的话,那么就只执行之后的UPDATE语句,原来的字段值不变。
比如一个例子:
表中有如下数据[表名为tb,url为主键]:

url name site

593668.com 我就上乐乐吧 593668

237h.com 爱上吃喝 237h

需要将site改成形如http格式那么就使用如下语句:

INSERT INTO tb (url,name,site) VALUES
('593668.com','','http://593668.com'),
('237h.com','','http://237h.com'),
('935s.com','就上我搜','http://935s.com')
ON DUPLICATE KEY UPDATE site=VALUES(site);

该语句执行后,表中数据如下:

url name site
593668.com 我就上乐乐吧 http://593668.com
237h.com 爱上吃喝 http://237h.com

935s.com 就上我搜 http://935s.com

可以看到,因为前二行数据url表中已经有数据,符合有重复值条件[ON DUPLICATE KEY],所以直接更新了site字段[UPDATE site=VALUES(site)],这时,name字段那怕是空白,但是也不会去重置name字段值,至于第三行数据则因为不存在重复值,所以就变成直接插入数据。
当然,这条语句执行效率可能还不如REPLACE INTO,不过无论是REPLACE INTO,还是INSERT INTO .. ON DUPLICATE KEY UPDATE ..,都需要注意,如果主键是自增的话,频繁使用这两个语句,会造成主键的值迅速增大,数据太大溢出就不能再增加新纪录了。
  评论这张
 
阅读(0)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

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

页脚

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