MySQL用存儲過程與函數批量插入數據


20.存儲過程與函數

  • 函數(FUNCTION)和存儲過程(PROCEDURE),最大區別在於函數有返回值,存儲過程沒有返回值。

  • 批量創建數據案例:

    # 創庫
    create database bigData;
    use bigData;
    
    # 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;
    
    # 建表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(20) 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;
    
  • 由於進行大批量數據插入,mysql會報一個錯誤。需要設置參數log_bin_trust_function_creators,它功效用於開啟二進制模塊,否則會報錯:This function has none of DETERMINISTIC...

  • 查看log_bin_trust_function_creators是否開啟:默認關閉

    show variables like 'log_bin_trust_function_creators';
    

  • 開啟

    1.終端開啟:
    	set global log_bin_trust_function_creators=1;
    # 這樣添加參數以后,如果mysqld重啟,上述參數會消失
    2.永久方式開啟:
    	windows 下my.ini [mysqld]添加:log_bin_trust_function_creators=1
    	linux下 /etc/my.cnf [mysqld]加上 log_bin_trust_function_creators=1
    
  • 創建函數,函數功能隨機生成字符串。保證每條數據都不同:

    DELIMITER $$
    CREATE FUNCTION rand_string(n INT) RETURNS VARCHAR(255)
    BEGIN
      DECLARE chars_str VARCHAR(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
      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 $$
    
    解釋:
    	DELIMITER $$
    	# 默認DELIMITER 為 ';',但是我們在編輯我們創建函數使用';'' 會終端我們編輯函數,這樣,我們通過 更給DELIMITER為$$,這樣就得到解決。
    	CREATE FUNCTION rand_string(n INT) RETURNS VARCHAR(255)
    	# 創建函數 rand_string 傳入n為int類型, 返回值 為varchar(255)
    	DECLARE 變量名稱  類型  DEFAULT 默認值
    	# while循環
    	WHILE 條件 DO
    	END WHILE;
    	# FLOOR函數:
    		FLOOR(RAND()*2)    # 表示0~2 隨機生成一個數
         # SUBSTRING
         	SUBSTRING('HELLO WORLD',1,5) # 表示截取'HELLO WORLD' 1-5位也就是'HELLO'
         # CONCAT 用於拼接
         	SELECT CONCAT('NO.',2);
    
  • 函數:所及產生部門編號

    DELIMITER $$
    CREATE FUNCTION rand_num()
    RETURNS INT(5)
    BEGIN
      DECLARE i INT DEFAULT 0;
      SET i=FLOOR(100+RAND()*10);
      RETURN i;
    END $$
    
  • 如果刪除函數只需執行:drop function 函數名;

  • 創建存儲過程,往emp表中插入數據的存儲過程:

    DELIMITER $$
    CREATE PROCEDURE insert_emp(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 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 $$
    
    解釋:
    	# SET autocommit=0; 每提交一條數據就會在終端打印,造成爆屏,所以可以關閉autocommit,最后我們再commit
    	# REPEAT ...UNTIL ... END REPEAT; 重復操作,知道UNTIL條件滿足就END REPEAT
    	# CURDATE 年月日
    
  • 創建存儲過程:往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 $$
    
  • 更改DELIMITER ; 成默認

  • 調用存儲過程插入10條數據 到dept

    CALL insert_dept(100,10);
    
  • 調用存儲過程插入500000條數據 到emp

    CALL insert_emp(100001,500000);
    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM