网上关于INSERT … ON DUPLICATE KEY UPDATE大多数文章都是同一篇文章转来转去,首先这个语法的目的是为了解决重复性,当数据库中存在某个记录时,执行这条语句会更新它,而不存在这条记录时,会插入它。

相当于先判断一条记录是否存在,存在则update,否则insert。其语法是:

INSERT INTO tablename(field1,field2, field3, ...)
VALUES(value1, value2, value3, ...)
ON DUPLICATE KEY UPDATE field1=value1,field2=value2, field3=value3, ...;

tablename是表名,field1,field2,field3等是字段名称,value1,value2,value3等是字段值。

例如:

INSERT INTO t_stock_chg
(f_market, f_stockID, f_name) VALUES ('SH', '600000', '白云机场')
ON DUPLICATE KEY
UPDATE f_market='SH', f_name='浦发银行';

这条语句如果记录不存在,插入该记录;存在将f_market改为SH,f_name改为浦发银行。现在有个问题是:这条语句判断该条记录是否存在的标准是什么?由于同一个值是可以同时出现在多个记录中的,所以必须有个字段是唯一不能重复的。

规则是这样的:如果你插入的记录导致一个UNIQUE索引或者primary key(主键)出现重复,那么就会认为该条记录存在,则执行update语句而不是insert语句,反之,则执行insert语句而不是更新语句。所以 ON DUPLICATE KEY UPDATE是不能写where条件的,例如如下语法是错误的:

INSERT INTO t_stock_chg
(f_market, f_stockID, f_name) VALUES ('SH', '600000', '白云机场')
ON DUPLICATE KEY UPDATE f_market='SH', f_name='浦发银行' WHERE f_stockID='600000';

因为由UNIQUE索引或者主键保证唯一性,不需要WHERE子条件。所以上语句中f_stockID就是唯一主键。

这里特别需要注意的是:如果行作为新记录被插入,则受影响行的值为1;如果原有的记录被更新,则受影响行的值为2,如果更新的数据和已有的数据一模一样,则受影响的行数是0,这意味着不会去更新,也就是说即使你有的时间戳是自动记录最后一次的更新时间,这个时间戳也不会变动。例如:

CREATE TABLE `t_stock_chg` (
`f_market` varchar(64) NOT NULL COMMENT '市场',
`f_stockID` varchar(10) NOT NULL DEFAULT '' COMMENT '股票代码',
`f_updatetime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '插入时间戳',
`f_name` varchar(16) DEFAULT NULL COMMENT '股票名称',
PRIMARY KEY (`f_market`,`f_stockID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

这里的字段f_updatetime每次在更新数据时会自动更新,但是如果记录中存在某条数据,后来又更新它,而更新的数据和原数据一模一样,那么这个字段也不会更新,仍然是上一次的时间。此时INSERT … ON DUPLICATE KEY UPDATE影响行数是0。

MySQL INSERT ... ON DUPLICATE KEY UPDATE语句相关推荐

  1. mysql 复合主键更新_MySQL复合主键下ON DUPLICATE KEY UPDATE语句失效问题

    问题的起因,假设有一张表,里面保存了交易订单,每张订单有唯一的ID,有最后更新时间,还有数据,详情如下: 针对这张表会做追加及更新的操作,具体来说就是如果订单不存在就INSERT一条新的,如果已存在就 ...

  2. insert ... on duplicate key update产生death lock死锁原理

    转载自  insert ... on duplicate key update产生death lock死锁原理 前言 编辑 我们在实际业务场景中,经常会有一个这样的需求,插入某条记录,如果已经存在了则 ...

  3. insert...on duplicate key update语法详解

    一.作用和使用场景 在mysql入库时,不能出现两条数据主键一致的情况,因为在两条数据的主键一致的情况下,mysql就会判定为待插入数据在数据库中存在重复数据,也就是说判断数据是否重复是根据主键来区别 ...

  4. MySQL中 ON DUPLICATE KEY UPDATE语法的使用

    MySQL ON DUPLICATE KEY UPDATE 为Mysql特有语法 ON DUPLICATE KEY UPDATE 用法与说明 Mysql中INSERT ... ON DUPLICATE ...

  5. MYSQL中ON DUPLICATE KEY UPDATE对数据进行insertOrUpdate操作

    本文来自:高爽|Coder,原文地址:[url]http://blog.csdn.net/ghsau/article/details/23557915[/url],转载请注明. 向数据库插入记录时,有 ...

  6. mysql批量更新,批量插入之replace语句/insert into... on duplicate key update语句

    mysql批量更新/插入数据有以下方法,使用这些方法批量插入数据/更新数据的时候就不用在代码层次增加判断数据是否已存在的逻辑了. 1:replace语句 2: insert into... on du ...

  7. MySQL的INSERT ··· ON DUPLICATE KEY UPDATE使用的几种情况

    MySQL的INSERT ··· ON DUPLICATE KEY UPDATE使用的几种情况 在MySQL数据库中,如果在insert语句后面带上ON DUPLICATE KEY UPDATE 子句 ...

  8. “ INSERT IGNORE”与“ INSERT…ON DUPLICATE KEY UPDATE”

    在执行包含多行的INSERT语句时,我想跳过重复的条目,否则它们会导致失败. 经过研究后,我的选择似乎是使用以下任一方法: ON DUPLICATE KEY UPDATE ,这意味着要付出一定的代价进 ...

  9. MySQL使用on duplicate key update时导致主键不连续自增

    在做数据统计的时候,我们经常会用到mysql的on duplicate key update语法来自动更新数据,比如 最近项目上需要实现这么一个功能:统计每个人每个软件的使用时长,客户端发过来消息,如 ...

  10. MySQL于ON DUPLICATE KEY UPDATE采用

    今天我们做的推断插入用途MySQL于ON DUPLICATE KEY UPDATE.现在,Mark下面! 假设你想做的事,再有就是在数据库中插入数据没有数据.如果有数据更新数据,然后你可以选择ON D ...

最新文章

  1. Redis读写分离技术架构解析
  2. yum 快速搭建lnmp环境
  3. delphi解决:Thread error 拒绝访问(5)
  4. KVM虚拟机安装管理——qemu-kvm方式
  5. python 笔记:读取mat文件
  6. ROS与navigation教程——基本导航调整指南
  7. 信息学奥赛一本通(1411:区间内的真素数)
  8. arduino液位传感器_如何使用Arduino + VL53L0X来制作液位感应设备
  9. ubuntu开机自启动脚本
  10. 将计算机设置成交换机主机名,各种交换机配置命令
  11. 【毕业设计/课程设计】基于Flutter的聊天社交应用
  12. 蓝色音箱改装电源_创新便携/无线音箱排行榜,创新便携/无线音箱十大排名推荐...
  13. 据说教师资格证除了当老师还有这些用途
  14. performance API 中什么指标可以衡量首屏时间
  15. JackKnife开发专题-方便快捷的IOC框架
  16. varlimo阿米洛机械键盘 win lock锁定
  17. 微服务与Spring Cloud简介
  18. Appium+python+夜神模拟器微信公众号 记录第一次写用例所踩的坑
  19. Springboot毕设项目高校人事管理系统il4i5(java+VUE+Mybatis+Maven+Mysql)
  20. 点亮LED灯驱动编写过程

热门文章

  1. 移动端学习笔记(小强测试品牌学员作品)
  2. zabbix item详解
  3. Java工程师如何在Docker上进行开发
  4. 发展型机器人:由人类婴儿启发的机器人. 2.6 本章总结
  5. 转: DH密钥交换和ECDH原理
  6. 1. 解决问题的能力
  7. 26. 安全 HTTP
  8. struts标签的使用
  9. 编程语言-Python-GUI
  10. angr进阶(2)C++程序的处理