MySQL快速生成大量測試數據


需要大量的測試數據用來學習索引,性能優化,分庫分表,等等。百度一下發現一個很不錯的博文,https://blog.csdn.net/leshami/article/details/84348477,本隨筆在此基礎上修改。畢竟咱要做個搬運工也得是個有靈魂的搬運工么

一、如果數據庫中表存在則刪除表

DROP TABLE IF EXISTS user;

二、如果存儲過程存在則刪除存儲過程

DROP PROCEDURE IF EXISTS prc_crt_user;

三、創建表結構

這是MySQL8使用創建表的方式,MySQL5創建表的方式與之不同,需要注意


CREATE TABLE user (
  uid int(11) NOT NULL auto_increment,
  mobile char(11) DEFAULT NULL,
  passwd varchar(50) DEFAULT NULL,
  name varchar(50) DEFAULT NULL,
  sex tinyint DEFAULT NULL,
  birthday datetime DEFAULT NULL,
  updated_time datetime DEFAULT NULL,
  PRIMARY KEY (uid)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

四、創建存儲過程

CREATE PROCEDURE prc_crt_user(l_cnt int)
BEGIN
    -- 定義兩個變量,一個整型的x默認值為0,另一個char類型的p
   DECLARE x INT DEFAULT 0;
   DECLARE p char(11);
   -- 開始進入循環體,目的是為了生成夠輸入參數的條數數據
   WHILE x < l_cnt
       -- 開始執行內容
   DO
       -- 行數的自增控制標志
      SET x = x + 1;
       -- 生成手機號 ,如果看不懂的話,多查查這幾個函數,太多了解釋不過來,下邊用到的會在下面解釋
      SET p =
             concat('1',
                    substring(cast(3 + (rand() * 10) % 7 AS char(50)), 1, 1),
                    right(left(trim(cast(rand() AS char(50))), 11), 9));
-- 執行插入user表動作 ,因為uid是自增
      INSERT INTO user(mobile,
                            passwd,
                            name,
                            sex,
                            birthday,
                            updated_time)
         VALUES (
                   p,
                 -- rand()會生成一個小於1的隨機小數 ,ceiling()向上取整,md5()求這個隨機整數的md5值當作密碼
                   md5(ceiling(rand() * 1000000)),
                 -- concat()函數就是拼接函數,它會將里面的參數拼接成一個字符串
                   concat(
                       -- substring()求子串,這里是將第一個參數字符串在第二個參數值的位置截取一位
                      substring(
                         '趙錢孫李周吳鄭王馮陳諸衛蔣沈韓楊朱秦尤許何呂施張孔曹嚴華金魏陶姜戚謝鄒喻柏水竇章雲蘇潘葛奚范彭郎魯韋昌馬苗鳳花方俞任袁柳酆鮑史唐費廉岑薛雷賀倪湯滕殷羅畢郝鄔安常樂於時傅皮齊康伍余元卜顧孟平黃和穆蕭尹姚邵堪汪祁毛禹狄米貝明臧計伏成戴談宋茅龐熊紀舒屈項祝董粱杜阮藍閔席季麻強賈路婁危江童顏郭梅盛林***鍾徐邱駱高夏蔡田樊胡凌霍虞萬支柯咎管盧莫經房裘干解應宗丁宣單杭洪包諸左石崔吉鈕龔興位零',
                          -- 總共有190個字符,為了避免越界需要用190相乘,floor()函數是向下取整
                         floor(1 + 190 * rand()),
                         1),
                      substring(
                         '明國華建文平志偉東海強曉生光林小民永傑軍金健一忠洪江福祥中正振勇耀春大寧亮宇興寶少劍雲學仁濤瑞飛鵬安亞澤世漢達衛利勝敏群波成榮新峰剛家龍德慶斌輝良玉俊立浩天宏子松克清長嘉紅山賢陽樂鋒智青躍元武廣思雄錦威啟昌銘維義宗英凱鴻森超堅旭政傳康繼翔棟仲權奇禮楠煒友年震鑫雷兵萬星駿倫紹麟雨行才希彥兆貴源有景升惠臣慧開章潤高佳虎根遠力進泉茂毅富博霖順信凡豪樹和恩向道川彬柏磊敬書鳴芳培全炳基冠暉京欣廷哲保秋君勁軒帆若連勛祖錫吉崇鈞田石奕發洲彪鋼運伯滿庭申湘皓承梓雪孟其潮冰懷魯裕翰征謙航士堯標潔城壽楓革純風化逸騰岳銀鶴琳顯煥來心鳳睿勤延凌昊西羽百捷定琦聖佩麒虹如靖日詠會久昕黎桂瑋燕可越彤雁孝憲萌穎藝夏桐月瑜沛誠夫聲冬奎揚雙坤鎮楚水鐵喜之迪泰方同濱邦先聰朝善非恆晉汝丹為晨乃秀岩辰洋然厚燦卓楊鈺蘭怡靈淇美琪亦晶舒菁真涵爽雅愛依靜棋宜男蔚芝菲露娜珊雯淑曼萍珠詩璇琴素梅玲蕾艷紫珍麗儀夢倩伊茜妍碧芬兒嵐婷菊妮媛蓮娟一',
                         floor(1 + 400 * rand()),
                         1),
                      substring(
                         '明國華建文平志偉東海強曉生光林小民永傑軍金健一忠洪江福祥中正振勇耀春大寧亮宇興寶少劍雲學仁濤瑞飛鵬安亞澤世漢達衛利勝敏群波成榮新峰剛家龍德慶斌輝良玉俊立浩天宏子松克清長嘉紅山賢陽樂鋒智青躍元武廣思雄錦威啟昌銘維義宗英凱鴻森超堅旭政傳康繼翔棟仲權奇禮楠煒友年震鑫雷兵萬星駿倫紹麟雨行才希彥兆貴源有景升惠臣慧開章潤高佳虎根遠力進泉茂毅富博霖順信凡豪樹和恩向道川彬柏磊敬書鳴芳培全炳基冠暉京欣廷哲保秋君勁軒帆若連勛祖錫吉崇鈞田石奕發洲彪鋼運伯滿庭申湘皓承梓雪孟其潮冰懷魯裕翰征謙航士堯標潔城壽楓革純風化逸騰岳銀鶴琳顯煥來心鳳睿勤延凌昊西羽百捷定琦聖佩麒虹如靖日詠會久昕黎桂瑋燕可越彤雁孝憲萌穎藝夏桐月瑜沛誠夫聲冬奎揚雙坤鎮楚水鐵喜之迪泰方同濱邦先聰朝善非恆晉汝丹為晨乃秀岩辰洋然厚燦卓楊鈺蘭怡靈淇美琪亦晶舒菁真涵爽雅愛依靜棋宜男蔚芝菲露娜珊雯淑曼萍珠詩璇琴素梅玲蕾艷紫珍麗儀夢倩伊茜妍碧芬兒嵐婷菊妮媛蓮娟一',
                         floor(1 + 400 * rand()),
                         1)),
                 -- %的意思是取余,很明顯值要么是1,要么是0
                   ceiling(rand() * 10) % 2,
                 -- 這個是拿現在時間減去 一個隨機的年份(20至60之間),再獲取日期
                   date(
                        now()
                      - INTERVAL (20 + ceiling(rand() * 100) % 40) YEAR),
                   concat('2018-',
                       -- 月份 1至12
                          1 + ceiling(rand() * 100) % 12,
                          '-',
                       -- 天數 ,%28 這個值就只能從一號到28號
                          1 + ceiling(rand() * 100) % 28))
                          -- 更新時間取現在時間
      ON DUPLICATE KEY UPDATE updated_time = now();
       -- 與上面的while對應
   END WHILE;
END;

調用存儲過程,填入要生成的行數

call prc_crt_user(100000);

去除,這一步可省略

DELETE
FROM user
WHERE mobile IN (SELECT mobile
                 FROM (SELECT u1.mobile
                       FROM user u1
                       GROUP BY u1.mobile
                       HAVING count(*) > 1) a)
  AND uid NOT IN (SELECT uid
                  FROM (SELECT min(u2.uid) AS uid
                        FROM user u2
                        GROUP BY u2.mobile
                        HAVING count(*) > 1) b);

 


免責聲明!

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



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