1. 程式人生 > >批量生成MySQL不重複手機號大表

批量生成MySQL不重複手機號大表

在MySQL很多測試場景,需要人工生成一些測試資料來測試。本文提供一個構造MySQL大表儲存過程,可以生成包含使用者名稱,手機號碼,出生日期等欄位。也可以通過濾重來使得手機號碼不重複,模擬現實場景。

一、生成指令碼

生成說明:
以下使用儲存過程批量生成包含使用者名稱,手機號,出生日期等欄位大表。
該儲存過程使用基於uid作為主鍵,因此會生成少量重複手機號碼,後面有濾重SQL指令碼。
如果想一次性生成不重複手機號碼,可以考慮修改以下指令碼,去掉uid,基於mobile列作為主鍵

DROP TABLE IF EXISTS big_table;

DROP PROCEDURE IF EXISTS prc_gen_user;

CREATE TABLE `big_table` (
  `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_gen_user(l_cnt int)
BEGIN
   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));

      INSERT INTO big_table(mobile,
                            passwd,
                            name,
                            sex,
                            birthday,
                            updated_time)
         VALUES (
                   p,
                   md5(ceiling(rand() * 1000000)),
                   concat(
                      substring(
                         '趙錢孫李周吳鄭王馮陳諸衛蔣沈韓楊朱秦尤許何呂施張孔曹嚴華金
                          魏陶姜戚謝鄒喻柏水竇章雲蘇潘葛奚範彭郎魯韋昌馬苗鳳花方俞任
                          袁柳酆鮑史唐費廉岑薛雷賀倪湯滕殷羅畢郝鄔安常樂於時傅皮齊康
                          伍餘元卜顧孟平黃和穆蕭尹姚邵堪汪祁毛禹狄米貝明臧計伏成戴談
                          宋茅龐熊紀舒屈項祝董粱杜阮藍閔席季麻強賈路婁危江童顏郭梅盛
                          林刁鍾徐邱駱高夏蔡田樊胡凌霍虞萬支柯咎管盧莫經房裘幹解應宗
                          丁宣賁鄧鬱單杭洪包諸左石崔吉鈕龔',
                         floor(1 + 190 * rand()),
                         1),
                      substring(
                         '明國華建文平志偉東海強曉生光林小民永傑軍金健一忠洪江福祥中
                          正振勇耀春大寧亮宇興寶少劍雲學仁濤瑞飛鵬安亞澤世漢達衛利勝
                          敏群波成榮新峰剛家龍德慶斌輝良玉俊立浩天巨集子鬆克清長嘉紅山
                          賢陽樂鋒智青躍元武廣思雄錦威啟昌銘維義宗英凱鴻森超堅旭政傳
                          康繼翔棟仲權奇禮楠煒友年震鑫雷兵萬星駿倫紹麟雨行才希彥兆貴
                          源有景升惠臣慧開章潤高佳虎根遠力進泉茂毅富博霖順信凡豪樹和
                          恩向道川彬柏磊敬書鳴芳培全炳基冠暉京欣廷哲保秋君勁軒帆若連
                          勳祖錫吉崇鈞田石奕發洲彪鋼運伯滿庭申湘皓承梓雪孟其潮冰懷魯
                          裕翰徵謙航士堯標潔城壽楓革純風化逸騰嶽銀鶴琳顯煥來心鳳睿勤
                          延凌昊西羽百捷定琦聖佩麒虹如靖日詠會久昕黎桂瑋燕可越彤雁孝
                          憲萌穎藝夏桐月瑜沛誠夫聲冬奎揚雙坤鎮楚水鐵喜之迪泰方同濱邦
                          先聰朝善非恆晉汝丹為晨乃秀巖辰洋然厚燦卓楊鈺蘭怡靈淇美琪亦
                          晶舒菁真涵爽雅愛依靜棋宜男蔚芝菲露娜珊雯淑曼萍珠詩璇琴素梅
                          玲蕾豔紫珍麗儀夢倩伊茜妍碧芬兒嵐婷菊妮媛蓮娟一',
                         floor(1 + 400 * rand()),
                         1),
                      substring(
                         '明國華建文平志偉東海強曉生光林小民永傑軍金健一忠洪江福祥中
                          正振勇耀春大寧亮宇興寶少劍雲學仁濤瑞飛鵬安亞澤世漢達衛利勝
                          敏群波成榮新峰剛家龍德慶斌輝良玉俊立浩天巨集子鬆克清長嘉紅山
                          賢陽樂鋒智青躍元武廣思雄錦威啟昌銘維義宗英凱鴻森超堅旭政傳
                          康繼翔棟仲權奇禮楠煒友年震鑫雷兵萬星駿倫紹麟雨行才希彥兆貴
                          源有景升惠臣慧開章潤高佳虎根遠力進泉茂毅富博霖順信凡豪樹和
                          恩向道川彬柏磊敬書鳴芳培全炳基冠暉京欣廷哲保秋君勁軒帆若連
                          勳祖錫吉崇鈞田石奕發洲彪鋼運伯滿庭申湘皓承梓雪孟其潮冰懷魯
                          裕翰徵謙航士堯標潔城壽楓革純風化逸騰嶽銀鶴琳顯煥來心鳳睿勤
                          延凌昊西羽百捷定琦聖佩麒虹如靖日詠會久昕黎桂瑋燕可越彤雁孝
                          憲萌穎藝夏桐月瑜沛誠夫聲冬奎揚雙坤鎮楚水鐵喜之迪泰方同濱邦
                          先聰朝善非恆晉汝丹為晨乃秀巖辰洋然厚燦卓楊鈺蘭怡靈淇美琪亦
                          晶舒菁真涵爽雅愛依靜棋宜男蔚芝菲露娜珊雯淑曼萍珠詩璇琴素梅
                          玲蕾豔紫珍麗儀夢倩伊茜妍碧芬兒嵐婷菊妮媛蓮娟一',
                         floor(1 + 400 * rand()),
                         1)),
                   ceiling(rand() * 10) % 2,
                   date(
                        now()
                      - INTERVAL (20 + ceiling(rand() * 100) % 40) YEAR),
                   concat('2018-',
                          1 + ceiling(rand() * 100) % 12,
                          '-',
                          1 + ceiling(rand() * 100) % 28))
      ON DUPLICATE KEY UPDATE updated_time = now();
   END WHILE;
END

二、資料填充

call prc_gen_user(1000);
Query OK, 1 row affected (1.38 sec)

select count(*) from big_table;
+----------+
| count(*) |
+----------+
| 1000 |
+----------+
1 row in set (0.00 sec)
select 'Leshami' author,'http://blog.csdn.net/leshami' Blog;
+---------+------------------------------+
| author | Blog |
+---------+------------------------------+
| Leshami | http://blog.csdn.net/leshami |
+---------+------------------------------+

三、濾重SQL語句

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

四、其它

本文參考了https://blog.csdn.net/hankersyan/article/details/79973899
並對其進行適當修改。