Mysql動態生成字母+固定位數的隨機數


在日常測試工作中,經常需要在短時間內構造大量的測試數據,如果只是幾條數據,可以直接insert,但是如果要上萬條呢,最近接到一個測試任務,就是模擬第三方,全量獲取數據,
因不方便跟第三方直接溝通,所以選擇直接從本地數據庫全量獲取數量,大批量插入數據有以下兩種方法,第一種就是通過excel造好直接導入數據庫,以下我們要講的是第二種方法,
通過sql的方式直接插入,
所以就有了下面的sql
 1 begin
 2     declare i int;
 3     set i=0;
 4     while i<1000 do
 5         insert INTO TEST(name,week,hash_code,model,config,province,city,end_update_time,buy_end_time,create_time,update_time,code)
 6    values((SELECT CONCAT('TES',CEILING(RAND()*90000000000000+10000000000000))),
 7    "2020-04-23 17:44:01","20200424132946","測試","EESS1P","上海","上海","2020-04-23 17:44:01","2020-04-23 17:44:01","2020-04-23 17:44:01","2020-04-23 17:44:01","test");
 8         set i=i+1;
 9      end while;
10     end

用navicat新建一個函數

解釋說明:

declare:作用范圍在begin到end語句塊之間。在該語句塊里設置的變量。declare語句專門用於定義局部變量。

set:語句是設置不同類型的變量,包括會話變量和全局變量

此處順便再普及下其它幾種變量:

用戶變量:以"@"開始,形式為"@變量名"。用戶變量跟mysql客戶端是綁定的,設置的變量,只對當前用戶使用的客戶端生效
全局變量:定義時,以如下兩種形式出現,set GLOBAL 變量名  或者  set @@global.變量名,對所有客戶端生效。
  只有具有super權限才可以設置全局變量 會話變量:只對連接的客戶端有效。

 

concat:concat()函數用於將多個字符串連接成一個字符串,下面這行sql就是TES拼接14位隨機數

SELECT CONCAT('TES',CEILING(RAND()*90000000000000+10000000000000)

ceiling:ceiling()函數對某一個值進行向上取整,去掉后面的小數,得到一個整數,如

mysql> SELECT CEILING(5.45);
       6

rand:rand()函數可以在0和1之間產生一個隨機數(0<x<1)

生成個位隨機整數:SELECT FLOOR(RAND()*10)
3
生成兩位隨機整數:SELECT FLOOR(RAND()*10+10)
11

 

注:此次存儲過程有個問題就是如果一次性插入數據過大如1w條,可能sql會報錯

是因為name字段做了口唯一索引,插入了重復數據,所以報錯,可見,上面生成隨機數的並不是非常靠譜,但是一般造數用還是可以的,比如一次性插入1000條,2000條等,要想造更多數據,可以多執行幾次即可,也是非常方便的

用rand生成隨機數只是一種方法,還可以用時間戳方式用作隨機數,1W條以內應該不會重復

select REPLACE(unix_timestamp(current_timestamp(4)),'.','') a2
15877050337914


免責聲明!

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



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