MySQL on duplicate key update 批量插入并更新已存在数据
业务上经常存在一种现象,需要批量往表中插入多条数据,但在执行过程中,很可能因为唯一键冲突,而导致批量插入失败。
因此需要事先判断哪些数据是重复的,哪些是新增的。
比较常用的处理方法就是找出已存在的数据,并将其与不存在的数据区分开,已存在的数据一条条的更新。不存在的数据则批量更新。
这种方法会导致代码逻辑复杂,同时严重降低代码效率。
为了应对这种业务场景,MySQL有一种专有语法(insert into ... on duplicate key update)批量插入并更新唯一键数据 CREATE TABLE `user_card` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`uid` int(10) DEFAULT '' COMMENT '用户ID',
`grade_id` int(10) DEFAULT '' COMMENT '等级ID',
`name` varchar(255) DEFAULT '' COMMENT '姓名',
`money` decimal(10,2) DEFAULT '0.00' COMMENT '余额',
PRIMARY KEY (`id`),
UNIQUE KEY `uid_gid` (`uid`,`grade_id`) -- 业务上的唯一键
) ENGINE=INNODB DEFAULT CHARSET=utf8 ;

如上图所示,批量插入的数据,遇到已存在记录(根据唯一键,创表语句中的 UNIQUE KEY 判断)时,自动更新已有的数据。
其中 money字段 以数据库现有值为准不进行更新, name字段使用了关键字 VALUES() 以外部值为准进行更新。
如果表中有多个唯一键(可以是单列索引或复合索引),则任意一个唯一键(UNIQUE KEY)冲突时,都会自动更新数据。
通过 on duplicate key update 语法,可以指定哪些字段进行更新,哪些字段不进行更新。
所有操作均由SQL处理,不需要额外程序代码分析,能够大幅提高程序执行效率。 P.S:补充下不使用 replace into 语法的原因:
1、replace into 遇到已存在的记录,会先删除掉表中原有的记录后,再插入新的记录,
这样会导致该记录的主键发生变化,如果该表的主键和其它表有业务关联,那么会导致关联数据丢失。
2、replace into 插入的主键在某些时候不是连续自增的,这样会导致主键增长的数据很快,有时候会超过 int(10) 的最大值
MySQL on duplicate key update 批量插入并更新已存在数据的更多相关文章
- mysql ON DUPLICATE KEY UPDATE重复插入时更新
mysql当插入重复时更新的方法: 第一种方法: 示例一:插入多条记录 假设有一个主键为 client_id 的 clients 表,可以使用下面的语句: INSERT INTO clients (c ...
- ON DUPLICATE KEY UPDATE重复插入时更新
mysql当插入重复时更新的方法: 第一种方法: 示例一:插入多条记录 假设有一个主键为 client_id 的 clients 表,可以使用下面的语句: INSERT INTO clients (c ...
- mysql ON DUPLICATE KEY UPDATE 与 REPLACE INTO 的区别
#mysql ON DUPLICATE KEY UPDATE 如果在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY ...
- mysql ON DUPLICATE KEY UPDATE ; 以及 同replace to 的区别.
需求: 1)如果admin表中没有数据, 插入一条 2)如果admin表中有数据, 不插入. 一般做法: if($result = mysql_query("select * from ad ...
- 深入mysql “ON DUPLICATE KEY UPDATE” 语法的分析
本篇文章是对mysql “ON DUPLICATE KEY UPDATE”语法进行了详细的分析介绍,需要的朋友参考下. mysql “ON DUPLICATE KEY UPDATE” 语法 如果在IN ...
- MySQL: ON DUPLICATE KEY UPDATE 用法 避免重复插入数据
INSERT INTO osc_visit_stats(stat_date,type,id,view_count) VALUES (?,?,?,?) ON DUPLICATEKEY UPDATE vi ...
- 深入mysql "on duplicate key update" 语法的分析
如果在INSERT语句末尾指定了on duplicate key update,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则在出现重复值的行执行UPDATE:如果不 ...
- mysql ON DUPLICATE KEY UPDATE、REPLACE INTO
INSERT INTO ON DUPLICATE KEY UPDATE 与 REPLACE INTO,两个命令可以处理重复键值问题,在实际上它之间有什么区别呢?前提条件是这个表必须有一个唯一索引或主键 ...
- mysql "ON DUPLICATE KEY UPDATE" 语法
如果在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则在出现重复值的行执行UPDATE:如果不 ...
随机推荐
- WordPress 主题开发:从入门到精通(必读)
本专栏介绍如何开发设计你自己的 WordPress 主题.如果你希望了解更多如何安装和应用主题的内容,请参阅应用主题文档.本文的内容不同于应用主题,因为所讨论的是编写代码去构建你自己的主题的技术内容, ...
- (转)php中字符过滤
有时候为了安全起见,我们需要对用户输入的字符串进行转义 文章中有不正确的或者说辞不清的地方,麻烦大家指出了--- 与PHP字符串转义相关的配置和函数如下: 1.magic_quotes_r ...
- Java连接MQTT服务-tcp方式
特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...
- linux如何查看所有的用户和组信息(转载)
[步骤一]cat /etc/passwdcat /etc/passwd查看所有的用户信息,详情如下图 [步骤二]cat /etc/passwd|grep 用户名 cat /etc/passwd|gre ...
- your current language level is ecmascript 5
https://stackoverflow.com/questions/32995066/how-can-i-configure-resharpers-language-level-for-ecmas ...
- java基本算法
1.链表 链表用来存储数据,由一系列的结点组成.这些结点的物理地址不一定是连续的,即可能连续,也可能不连续,但链表里的结点是有序的.一个结点由数据的值和下一个数据的地址组成.一个链表内的数据类型可以是 ...
- typescript 接口 interface
代码: // 接口:行为的抽象 // 一.对class类的约束 // 接口定义 // 打印机 interface Iprinter { Printing(msg:string):string; } i ...
- C#三种常用的读取XML文件的方法
下面我将介绍三种常用的读取XML文件的方法.分别是 1: 使用 XmlDocument 2: 使用 XmlTextReader 3: 使用 Linq to Xml 这里我先创建一个XML文件,名为Bo ...
- Elasticsearch 6.2.3版本 Windows环境 简单操作
背景描述 Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎.无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进.性能最好的.功能最全的搜索引擎库. El ...
- runoob_Java 方法
可变参数 JDK 1.5 开始,Java支持传递同类型的可变参数给一个方法. 方法的可变参数的声明如下所示: typeName... parameterName 在方法声明中,在指定参数类型后加一个省 ...