Mysql批量插入1000w條資料
阿新 • • 發佈:2018-12-13
- 1 登陸mysql,新建bigData庫
//登入MySQL
[[email protected] ~]# cd /usr/database/mysql5.7/bin
[[email protected] bin]# ./mysql -u root -p
Enter password:
//SUCCESS
create database bigData;
use bigData;
- 2 新建dept(部門表)
CREATE TABLE dept( id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0, dname VARCHAR(20) NOT NULL DEFAULT "", loc VARCHAR(13) NOT NULL DEFAULT "" ) ENGINE=INNODB DEFAULT CHARSET=GBK ;
- 3 新建 emp(員工表)
CREATE TABLE emp( id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, empno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,/*編號*/ ename VARCHAR(20) NOT NULL DEFAULT "", /*名字*/ job VARCHAR(9) NOT NULL DEFAULT"",/*工作*/ mgr MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,/*上級編號*/ hiredate DATE NOT NULL,/*入職時間*/ sal DECIMAL(7 ,2) NOT NULL,/*薪水*/ comm DECIMAL(7 ,2) NOT NULL,/*紅利*/ deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0 /*部門編號*/ )ENGINE =INNODB DEFAULT CHARSET=GBK ;
- 4 設定引數 log_bin_trust_function_creators
建立函式,假如報錯: This function has none of DETERMINISTI.....
#由於開啟過慢查詢日誌,因為我們開啟了bin-log, 我們就必須為我們的function指定一個引數。
show variables like 'log_bin_trust_function_creators';
set global log_bin_trust_function_creators=1;
#這樣添加了引數以後,如果mysqld重啟,. 上述引數又會消失,
- 5 建立函式,保證每條資料都不同 隨機產生字串
DELIMITER $$
CREATE FUNCTION rand_string(n INT) RETURNS VARCHAR(255)
BEGIN
DECLARE chars_str VARCHAR(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ';
DECLARE return_str VARCHAR(255) DEFAULT '';
DECLARE i INT DEFAULT 0;
WHILE i<n DO
SET return_str =CONCAT(return_str,SUBSTRING(chars_str,FLOOR(1+RAND()*52),1));
SET i=i+1;
END WHILE;
RETURN return_str;
END $$
//sql預設每一行的分號結尾,函式程式碼中有很多分號,為了讓程式整體執行,暫時用$$結尾;
隨機產生部門編號
#用於隨機產生部門編號
DELIMITER $$
CREATE FUNCTION rand_num( )
RETURNS INT(5)
BEGIN
DECLARE i INT DEFAULT 0;
SET i= FLOOR(100+RAND()*10);
RETURN i;
END $$
- 6 建立儲存過程
建立往emp表中插入資料的儲存過程
DELIMITER $$
CREATE PROCEDURE insert_emp(IN START INT(10),IN max_num INT(10))
BEGIN
DECLARE i INT DEFAULT 0;
##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 ,CURDATE(),2000,400,rand_num());
UNTIL i= max_num
END REPEAT;
COMMIT;
END $$
建立往dept表中插入資料的儲存過程
#執行儲存過程,往dept表新增隨機資料
DELIMITER $$
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+1;
INSERT INTO dept (deptno ,dname,loc ) VALUES ((START+i) ,rand_string(10),rand_string(8));
UNTIL i= max_num
END REPEAT;
COMMIT;
END $$
6 呼叫儲存過程
//DELIMITER ; 恢復預設;結尾
CALL insert_dept(100,10);
執行儲存過程,向emp表中插入50萬條資料,差多了怕機器掛了
CALL insert_emp(100001,500000)