mysql的存儲過程造數據

轉自:https://mp.weixin.qq.com/s/yz5S4hCGFkJajSpbaLgu6g 對應的sql存儲過程模塊

 

使用mysql的存儲過程造10萬條數據。

在性能測試中,經常需要模擬大量用戶同時訪問,需要構建大量測試數據。構建數據可以通過一些工具來執行,也可以通過使用SQL創建一個存儲過程,在存儲過程中通過循環執行insert語句,實現添加多條數據的功能。

語句的主體如下: 

首先,我們假定有一個表user, 它有兩個字段username和password。都是字符串類型,最大長度爲20。我們向列表中插入的數據應該是隨機的字符串,所以先創建一個生成隨機字符串的函數。

--第1行DELIMITER //,指定分隔符。在函數、存儲過程體中,因爲多個語句組成一個整體,不能遇到分號就執行,所以需要額外指定一個分隔符來指定語句塊的結束。第一行就是聲明瞭使用雙斜線作爲分隔符。

--第2行,DROP FUNCTION IF EXISTS `rand_string` //,如果函數已存在就刪除。

--第3行,使用CREATE FUNCTION創建這個函數,一行中說明函數名、函數參數、返回值和字符集編碼格式。

--第4行,用BEGIN來標識函數體開始

--第5-7行,接着定義三個變量,分別表示字符範圍字符串(範圍爲大小寫字母和數字),結果字符串(初始爲空字符串),和標識循環次數的變量(初始值爲0)

--第8-11行,一個while循環,以WHILE…DO開始,以END結束,根據用戶調用函數時傳的參數,決定循環次數,每次循環向空字符串上拼接一個隨機取得的字符,其中substring(chars_str , FLOOR(1 + RAND()*62 ),1)代表從chars_str中,從隨機一位開始,取出長度爲1的子串,其中RAND, FLOOR, substring都是SQL的內置函數。再用concat函數拼接在結果字符串上。

--第12行,循環結束,將最終拼成的字符串返回。

DELIMITER //     
DROP FUNCTION IF EXISTS `rand_string` // 
CREATE FUNCTION `rand_string`(n INT) RETURNS varchar(255) CHARSET utf8 BEGIN 
    DECLARE chars_str varchar(255) DEFAULT'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; 
    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()*62 ),1));
        SET i = i + 1;
    END WHILE;
    RETURN return_str; 
END//

定義完這個函數後,我們就可以利用它,來創建插入數據的存儲過程。 

DELIMITER //              --還是聲明分隔符
DROP PROCEDURE IF EXISTS `batch_insert`; --若存儲過程存在,則刪除CREATE PROCEDURE `batch_insert`(in n INT) --創建存儲過程,參數爲插入數據條數n
    BEGIN  --存儲過程體開始
    DECLARE i INT DEFAULT 0;  --定義控制循環次數的變量i
    WHILE i < n DO  --循環n次插入數據
        insert into user(username,password)VALUES(rand_string(10),rand_string(10)) ; 
        SET i = i + 1;   -- i值自增
    END WHILE;   --循環結束
END// --存儲過程結束

  創建完成後,就可以調用這個存儲過程來創建數據了!call batch_insert(100000); 


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章