有时候我们需要往表中批量插入几万甚至几十万条数据,这时候总不可能手工一条条插入的,这估计得累死人,可以利用MySQL的函数和存储过来实现这个需求。

1、建立测试需要的表

CREATE TABLE `dept` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`deptName` VARCHAR(30) DEFAULT NULL,
`address` VARCHAR(40) DEFAULT NULL,
ceo INT NULL ,
PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
CREATE TABLE `emp` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`empno` INT NOT NULL ,
`name` VARCHAR(20) DEFAULT NULL,
`age` INT(3) DEFAULT NULL,
`deptId` INT(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

2、参数设置

MySQL有一个参数log_bin_trust_function_creators,当二进制日志启用后,这个变量就会启用,目的是为了控制是否信任存储函数的创建者,不会创建写入引起二进制日志不安全事件的存储函数。默认值为0,表示不允许创建或修改存储函数。
如果在变量值为0的情况下创建存储函数,就会报错

ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)

那么为什么MySQL有这样的限制呢? 因为二进制日志的一个重要功能是用于主从复制,而存储函数有可能导致主从的数据不一致。所以当开启二进制日志后,参数log_bin_trust_function_creators就会生效,限制存储函数的创建、修改、调用。

所以为了测试,我们需要把该参数打开,不然没法玩了。注意使用命令打开,重启后就会失效,如果要永久生效,需要修改my.cnf。

3、编写随机函数

这里需要两个随机函数就够了,一个产生随机数字,一个产生随机字符串。

3.1 产生随机字符串
-- 定义分隔符为$$,不然遇到;就会结束
DELIMITER $$
-- 函数名为rand_string,入参为n,类型为int,返回值为varchar类型,长度为255
CREATE FUNCTION rand_string(n INT) RETURNS VARCHAR(255)
BEGIN
-- 定义一个变量chars_str,有默认值
DECLARE chars_str VARCHAR(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ';
DECLARE return_str VARCHAR(255) DEFAULT '';
DECLARE i INT DEFAULT 0;
-- 生成长度为n的随机字符串,存入return_str
WHILE i < n DOSET return_str = CONCAT(return_str, SUBSTRING(chars_str, FLOOR(1 + RAND() * 52), 1));SET i = i + 1;
END WHILE;
RETURN return_str;
END $$
3.2 产生随机数字
-- 随机产生from_num到to_num范围内的数
DELIMITER $$
CREATE FUNCTION rand_num(from_num INT, to_num INT) RETURNS INT(11)
BEGINDECLARE i INT DEFAULT 0;SET i = FLOOR(from_num + RAND() * (to_num - from_num +1));RETURN i;
END $$

如果要删除函数,使用下面的命令

drop function function_name;

4、创建存储过程

4.1 往emp表中插入数据的存储过程
DELIMITER $$
CREATE PROCEDURE insert_emp(START INT, max_num INT)
BEGIN
DECLARE i INT DEFAULT 0;
-- 把自动提交关闭
set autocommit = 0;
REPEAT
SET i = i +1;
INSERT INTO emp(empno, NAME, age, deptid) VALUES((START + i), rand_string(6), rand_num(30, 50), rand_num(1, 10000));
UNTIL i = max_num
END REPEAT;
COMMIT;
END $$-- 删除
DELIMITER ;
drop PROCEDURE insert_emp;
4.2 往dept表中插入数据的存储过程
DELIMITER $$
CREATE PROCEDURE insert_dept(max_num INT)
BEGIN
DECLARE i INT DEFAULT 0;
SET autocommit = 0;
REPEAT
SET i = i + 1;
INSERT INTO dept(deptname, address, ceo) VALUES(rand_string(8), rand_string(10), rand_num(1, 500000));
UNTIL i = max_num
END REPEAT;
COMMIT;
END $$-- 删除
DELIMITER ;
drop PROCEDURE insert_dept;

5、调用存储过程

5.1 添加数据到部门表
-- 执行存储过程,往dept表添加1w条数据
DELIMITER ;
CALL insert_dept(10000);
5.2 添加数据到员工表
-- 执行存储过程,往emp表添加200w条数据
DELIMITER ;
CALL insert_emp(100000, 2000000);

6、批量删除某个表上的所有索引

6.1 创建删除索引的存储过程
DELIMITER $$
CREATE PROCEDURE proc_drop_index(dbname VARCHAR(200), tablename VARCHAR(200))
BEGINDECLARE done INT DEFAULT 0;DECLARE ct INT DEFAULT 0;DECLARE _index VARCHAR(200) DEFAULT '';DECLARE _cur CURSOR FOR SELECT index_name FROM information_schema.STATISTICS WHERE table_schema = dbname AND table_name = tablename AND seq_in_index = 1 AND index_name <> 'PRIMARY';DECLARE CONTINUE HANDLER FOR NOT FOUND set done = 2;OPEN _cur;FETCH _cur INTO _index;WHILE _index <> '' DOSET @str = CONCAT("drop index ", _index, " on ", tablename);REPEAT sql_str FROM @str;EXECUTE sql_str;DEALLOCATE PREPARE sql_str;SET _index = '';FETCH _cur INTO _index;END WHILE;
CLOSE _cur;
END $$
6.2 执行存储过程
CALL proc_drop_index("dbname", "tablename");

MySQL批量插入测试数据相关推荐

  1. MYSQL批量插入数据库实现语句性能分析

    MYSQL批量插入数据库实现语句性能分析 假定我们的表结构如下 代码如下   CREATE TABLE example ( example_id INT NOT NULL, name VARCHAR( ...

  2. mysql批量插入 增加参数_MySql 的批量操作,要加rewriteBatchedStatements参数

    MySql 的批量操作,要加rewriteBatchedStatements参数 作者:赵磊 博客:http://elf8848.iteye.com ------------------------- ...

  3. mysql批量插入跟更新_Mysql批量插入和更新的性能-问答-阿里云开发者社区-阿里云...

    利用Hibernate,连接池使用的是BoneCP,做了一个MySql批量插入和批量更新的Demo,出现了下面两个问题. 1.批量插入.我采用的是原生态的JDBC,每次批量插入60条数据左右(数据量不 ...

  4. Mysql批量插入数据问题解决和优化

    Mysql批量插入数据问题解决和优化 一.问题描述 项目中mysql批量插入大概50000左右数据,使用事务和批量,但是速度依旧很慢,大约60s左右,迫切希望改进这个问题. 二.问题原因 尽管是批量a ...

  5. mysql 批量插入亿级数据做测试用

     mysql 批量插入亿级数据做测试用 表结构: -- 性能提升 SELECT COUNT(*) from `user`.`user` ; SHOW VARIABLES; set session bu ...

  6. Mysql批量插入更新性能优化

    Mysql批量插入更新性能优化 对于数据量较大的插入和更新,因io/cpu等性能瓶颈,会产生大量的时间消耗,目前主流的优化主要包括预编译.单条sql插入多条数据.事务插入等,下面详细介绍一下: 单条插 ...

  7. mysql批量插入跟更新_Mysql批量插入和更新的性能

    利用Hibernate,连接池使用的是BoneCP,做了一个MySql批量插入和批量更新的Demo,出现了下面两个问题. 1.批量插入.我采用的是原生态的JDBC,每次批量插入60条数据左右(数据量不 ...

  8. PgSQL批量插入测试数据

    PgSQL批量插入测试数据 1 pgsql批量插入测试数据测试 pgsql批量插入测试数据测试 1.1 测试准备 -- 1.创建测试表t_user create table if not exists ...

  9. node.js中mysql批量插入更新的三种方法

    [背景]在项目中遇到一个批量插入数据的需求,由于之前写过的sql语句都是插入一个对象一条数据,于是去网上搜关键词 "sql批量插入"."mysql批量插入"等, ...

  10. Mysql 批量插入大量数据的两种方案以及优缺点(分别是 5W 条数据和 10W 条数据)

    Mysql 批量插入(5W 条数据和 10W 条数据) 1.批量插入思路 一般是有两种不同的思路: 1.for 循环批量插入 2.生成一条 SQL 语句,比如 insert into user(id, ...

最新文章

  1. 用Python实现坦克大战游戏 | 干货贴
  2. 自然语言处理(NLP)之英文单词词性还原
  3. uboot环境变量-带分号的环境变量
  4. 科学解释超级计算机,超级计算机:彻底“改变”科学
  5. dhtmlxtree api中文
  6. K 个一组翻转链表Python解法
  7. Redis-相关概念记录
  8. php api查询开发,PHP开发API接口(注册、登录、查询用户信息)的实例代码
  9. python技巧——list comprehension vs map
  10. realtek audio console无法连接rpc服务_程序员修神之路设计一套RPC框架并非易事
  11. 蓝桥杯网站试题练习系统网站,想拿国奖就靠它
  12. 达梦数据库查询表结构
  13. 【天津SEO】长尾关键词挖掘的八种技巧
  14. 自动化测试框架基石工程
  15. 在React项目中引入字体文件并使用
  16. 如何解决仓库无线网络覆盖问题?
  17. 一组li或者div里面多个弹出层对应各自的内容
  18. 红米5 Android 8.0,红米 5 获得 Android 8.0 稳定版更新:修复大量问题
  19. 杰理AC692X学习-BLE与APP端发送与接收
  20. 耳机重装系统后服务器坏了,Win7重装后耳机没声音|重装系统后耳机没声音怎么办?...

热门文章

  1. AC/DC、DC/DC转换器基础指南(二)
  2. Java5种算术运算符,Java算术运算符
  3. 通过URL链接将文件下载到本地
  4. 程序员常用软件,你用了哪些
  5. 目标跟踪之ADMM求解简介
  6. CDA Level1 考试心得
  7. python脚本实现QQ自动发送消息
  8. halcon相机标定助手_Halcon教程之单相机标定
  9. 步进电机驱动器电压是多少?
  10. 【常识】户型图要怎么看?买房时销售员不会说的注意事项