开发者学堂课程【MySQL 高级应用 - 索引和锁:批量插入数据脚本】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/598/detail/8627
批量插入数据脚本
前言:如果要往表里插入1000w 数据,该怎么办
一、复习
复习上课的内容:
函数和存储过程是用 SQL 脚本语言写的数据库编程。
功能:一批次数据的插入。
函数和存储过程的区别:函数有返回值,存储过程没有返回值。
关键词:建表 create table ,建索引 create index ,建函数 create function ,建视图 create view
二、批量插入数据脚本
1.建表
如果愿意单独建一个大数据的 bigData 可以执行下面代码。
#新建库
create database bigData:
use bigData; I
如果不愿意可以忽略上面代码,直接操作下面代码
#1建表 dept
//构建部门表
CREATE TABLE dept(
id INT UNSIGNED PRIMARY KEY AUTO INCREMENT
deptno MEDIUMINT UNSIGNED NOT NULL DEFAULTO
dnameVARCHAR(20)NOT NULL DEFAULT"",
loc VARCHAR(13)NOT NULL DEFAULT"
)ENGINE=INNODBDEFAULTCHARSET=GBK:
#2建表 emp
//构建员工表
CREATE TABLE emp
(
id INT UNSIGNED PRIMARY KEY AUTO INCREMENT
empno MEDIUMINT UNSIGNED NOTNULL DEFAULTO/*
编号*/ ename VARCHAR(20)NOT NULL DEFAULT"/*名字*/ job VARCHAR(9) NOT NULL DEFAULT"",/*工作*/
mgr MEDIUMINT UNSIGNED NOT NULL DEFAULTO/*
上级编号*/ hiredate DATE NOT NULL,/*入职时间*/ sal DECIMAL(72)NOT NULL,1*薪水*/ commDECIMAL(72)NOT NULL./*红利*1
deptno MEDIUMINT UNSIGNED NOT NUL DEFAULTO/
部门编号*1)ENGINE=INNODB DEFAULT CHARSET=GBK;
2. 设置参数
做大数据插入的时候 mysqld 会报错,需要设置参数二进制日志开启模块设置
log_bin_trust_function_creators
创建函数,假如报错:
This function has none of DETERMINISTIC....
#由于开启过慢查询日志,因为我们开启了 bin-log 我们就必须为我们的 function 指定一个参数。
show variables like 'log bin trust function creators'
set global log bin trust function_creators=1;
#这样添加了参数以后,如果 mysql 重启,上述参数又会消失,永久方法:
windows 下:
myinilmysqldl加上
logbintrust function creators=1
linux 下:
/etc/mycnf下
mycnf[mysqld]
加上
logbin trust function creators=1
3. 创建函数保证每条数据都不同
由于 MySQL 的本身没有随机产生字符串和随机产生部门编号
的函数,需要自己创建。
1.随机产生字符串
DELIMITER $$
CREATE FUNCTION rand string(n INT) RETURNS VARCHAR (255)
BEGIN
DECLARE chars_str VARCHAR(100) DEFAULT 'abcdefghijklmnopgrstuvwxy zABCDEFJHIJKLMNOPQRSTUVWXYZ'
DECLARE return str VARCHAR (255) DEFAULT
DECLARE 1 INT DEFAULT 0;
E WHILE i< n Do
RETURN return stri
SET return_str =CONCAT(return_str, SUBSTRING(chars_str,
FLOOR(1+RAND( *52),1));
SET i=i+i;
END WHILE;
RETURN return stri
END SS
2.随机产生部门编号
BEGIN
DECLARE i INT DEFAULT 0;
SET i = FLOOR(100+RAND(*10)
RETURN i;
END SS
4.创建存储过程
1.创建往 emp 表中插入数据的存储过程
DELIMITER $$
CREATE PROCEDURE insert_emp(IN START INT (10), IN max_num INT (10))
BEGIN
DECLARE i INT DEFAULT O;
set autocommit=0
把 autocommit 设置成0
SET autocommit =0;
REPEAT
SET i=i+1;
INSERT INTO emp (empno, ename ,job ,mgr ,hiredate,sal ,comm
,deptno) VALUES((START+i), rand string(6),'SALESMAN,0001, CURD
UNTIL i= max_num
END REPEAT:
COMMIT
END $$
2.创建往 dept 表中插入数据的存储过程
DELIMITER $$
CREATE PROCEDURE insert dept(IN START INT (10),IN max_num INT(10))
BEGIN
DECLARE i INT DEFAULT O;
SET autocommit =0;
REPEAT
SET i=i+1;
INSERT INTo dept (deptno dname, loc VALUES ((START+), rand string(10), rand string(8));
UNTIL i= max_nun
END REPEAT;
COMMIT
END $$
5.调用存储过程
1.dept
DELIMITER:
CALL insert_dept(100,10);
2.emp
执行存储过程,往 emp 表添加50万条数据
DELIMITER;
CALL insert_emp(100001,500000);
mysq1 >DEL IMITER SS
mysq1> CREATE PROCEDURE insert_dept(IN START INT(10)IN max num INT(10))
BEGIN
DECLARE i INT DEFAULT 0:
SET autocommit=0;
REPEAT
SET i=i+l;
INSERT INTO dept(deptno ,dname,loc)VALUES((START+i),rand _string(10),rand_string(8));
UNTIL i=max_num
END REPEAT;
COMMIT;
END SS
Query OK,0 rows affected(0.00 sec)
mysq1> DELIMITER ;
mysq1> CALL insert emp(100001500000):
Query OK,0 rows affected,1 warning(1 min 14.62 sec)