MySQL批量插入与更新
目录
准备表和测试数据
insert into values、insert into select
replace into
insert into on duplicate key update
insert ignore into
总结
准备表和测试数据
CREATE TABLE `t` (`id` int(11) NOT NULL,`age` int(11) DEFAULT NULL,`name` varchar(20) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;CREATE TABLE `t_copy` (`id` int(11) NOT NULL,`age` int(11) DEFAULT NULL,`name` varchar(20) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- t_copy 创建两条条数据
INSERT INTO t_copy VALUES (3, 30, 'c'),(4, 22, 'd');
insert into values、insert into select
INSERT INTO t
VALUES(1, 20, 'a'),(2, 26, 'b');-- 两张表的字段要一一对应
INSERT INTO t SELECT id,age,name from t_copy where id < 10;
结果:
1 20 a
2 26 b
3 30 c
4 22 d
注:insert into values 或 insert into select批量插入时,都满足事务的原子性与一致性,一条出错整体都会回滚。在使用insert into select时,MySQL会对select的数据加S(读)锁,在事务较为复杂的场景下可能有死锁的风险,下篇博客会总结。
replace into
replace into表示插入替换数据,当记录中有PrimaryKey,或者unique索引的话,如果数据库已经存在数据,则用新数据替换(先delete再insert),如果没有数据效果则和insert into一样。
REPLACE INTO t (id,age) VALUES (2, 15);
结果:
1 20 a
2 15 NULL
3 30 c
4 22 d
insert into on duplicate key update
insert into on duplicate key update表示插入更新数据,当记录中有
PrimaryKey,或者
unique索引的话,
如果数据库已经存在数据,则用新数据更新(update),如果没有数据效果则和insert into一样。
INSERT INTO t (id, age)
VALUES (3, 28),(4, 29)
ON DUPLICATE KEY UPDATEid = VALUES(id),age = VALUES(age);
结果:
1 20 a
2 15 NULL
3 28 c
4 29 d
insert ignore into
insert ignore into表示尽可能的忽略冲突,暴力插入。
INSERT IGNORE INTO t VALUES(1,30,'f'),(6,33,'o');
结果:
1 20 a
2 15 NULL
3 28 c
4 29 d
6 33 o
注:可以看到,虽然记录为1的数据会产生主键冲突,但insert ignore into会进行忽略,继续执行记录6的插入。另外除了唯一约束的冲突,类似于字段超出长度、类型不匹配等错误,insert into on duplicate key update与replace into都会整体失败,而insert ignore into不会失败,它对于类型不匹配且无法转化的提供了默认值,超出长度的按照最大长度进行了截取。
总结
- insert into values 或 insert into select批量插入时,都满足事务的原子性与一致性,但要注意insert into select的加锁问题。
- replace into与insert into on duplicate key update都可以实现批量的插入更新,具体是更新还是插入取决与记录中的pk或uk数据在表中是否存在。如果存在,前者是先delete后insert,后者是update。
- insert ignore into会忽略很多数据上的冲突与约束,平时很少使用。
MySQL批量插入与更新相关推荐
- mysql批量插入跟更新_Mysql批量插入和更新的性能-问答-阿里云开发者社区-阿里云...
利用Hibernate,连接池使用的是BoneCP,做了一个MySql批量插入和批量更新的Demo,出现了下面两个问题. 1.批量插入.我采用的是原生态的JDBC,每次批量插入60条数据左右(数据量不 ...
- mysql批量插入跟更新_Mysql批量插入和更新的性能
利用Hibernate,连接池使用的是BoneCP,做了一个MySql批量插入和批量更新的Demo,出现了下面两个问题. 1.批量插入.我采用的是原生态的JDBC,每次批量插入60条数据左右(数据量不 ...
- Mysql批量插入更新性能优化
Mysql批量插入更新性能优化 对于数据量较大的插入和更新,因io/cpu等性能瓶颈,会产生大量的时间消耗,目前主流的优化主要包括预编译.单条sql插入多条数据.事务插入等,下面详细介绍一下: 单条插 ...
- node.js中mysql批量插入更新的三种方法
[背景]在项目中遇到一个批量插入数据的需求,由于之前写过的sql语句都是插入一个对象一条数据,于是去网上搜关键词 "sql批量插入"."mysql批量插入"等, ...
- Mysql批量插入数据问题解决和优化
Mysql批量插入数据问题解决和优化 一.问题描述 项目中mysql批量插入大概50000左右数据,使用事务和批量,但是速度依旧很慢,大约60s左右,迫切希望改进这个问题. 二.问题原因 尽管是批量a ...
- 批量插入或更新数据(MyBatis-plus框架)
目录 1.场景说明 2.DUPLICATE 和REPLACE比较 3.批量插入或者更新(两种方式) 方式一:mybatis-plus的saveOrUpdateBatch方法 问题:如果操作类集成了基础 ...
- pg批量插入_PostgreSQL实现批量插入、更新与合并操作的方法
前言 就在 2019 年 1 月份微软收购了 PostgreSQL 数据库的初创公司 CitusData, 在云数据库方面可以增强与 AWS 的竟争.AWS 的 RDS 两大开源数据库就是 MySQL ...
- PostgreSQL实现批量插入、更新与合并操作的方法_PostgreSQL_脚本之家
前言 就在 2019 年 1 月份微软收购了 PostgreSQL 数据库的初创公司 CitusData, 在云数据库方面可以增强与 AWS 的竟争.AWS 的 RDS 两大开源数据库就是 MySQL ...
- MYSQL批量插入数据库实现语句性能分析
MYSQL批量插入数据库实现语句性能分析 假定我们的表结构如下 代码如下 CREATE TABLE example ( example_id INT NOT NULL, name VARCHAR( ...
最新文章
- Android开发之LisitView的图文并排效果实现(源代码分享)
- python横向合并merge_【Python代替Excel】7:merge、concat、append
- AT2165-[AGC006D]MedianPyramidHard【二分,贪心】
- [转载]eXeScope 6.50本地溢出分析
- mysql gtid 主键冲突_数据库开启gtid时,需要注意的问题
- matlab极坐标下的二维傅里叶变换_形象理解二维傅里叶变换
- 【并查集】Union Find
- oracle查询:分组查询,取出每组中的第一条记录
- httprunner接口测试脚本自动生成
- Jenkins中的一些问题解决(~~不断更新~~)
- Python替换多个tomcat端口号
- 荣耀9桌面没有计算机,荣耀9四个隐藏功能,你用过几个?
- keybert:基于bert模型的关键词抽取工具
- solidworks图纸模板添加_「solidworks工程图模板」solidworks怎么添加置工程图模板? - seo实验室...
- githup找回被删除的文件
- 关于MySQL的驱动org.gjt.mm.mysql.Driver
- Linux下clock_gettime函数详解
- ChatGPT技术原理 第七章:Seq2Seq模型
- 动态网站数据采集 - 去哪儿网火车票查询爬虫
- cordova在使用jqmobile中出现的问题(使用$(window).on与window.addEventListener)