MySQL函數和存儲過程生成電話號碼

電話號碼是有11位數字組成,因此在生成電話號碼以前咱們先來看一看怎樣經過函數生成字符串。sql

DELIMITER $$
CREATE FUNCTION rand_num(n int) RETURNS VARCHAR(255)
BEGIN
    DECLARE chars_str varchar(20) DEFAULT '0123456789';
    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()*10 ),1));
        SET i = i +1;
    END WHILE;
    RETURN return_str;
END $$
DELIMITER ;

 MySQL的隨機函數rand()返回的是一個float類型的數字nn的取值範圍是0<=n<1。值得注意的是能取到0可是不能取到1數組

顯然上面的rand()*10+1的取值範圍爲[1,11),能取到1可是不能取到11,內置函數floor的做用是向下取整。因此floor(rand()*10+1)的取值範圍爲[1,10]函數

由於MySQL中沒有內置數組,因此咱們用字符串來模擬,首先來看內置函數substringstr,x,y)是表示在字符串str中從x位置開始,截取長度爲y的字符串。X1開始。測試

內置函數concat(str1,str2,…strn)的做用是把字符串str1strn拼接成一個字符串。因此上面的函數不難理解。就是每次循環從’0123456789’10個數字中隨機截取一個數字拼接在咱們要返回的字符串中。參數n表示拼接字符串的長度。spa

 

有了上面的函數,咱們能夠經過rand_num(11)這樣的方式來獲得一個字符串,可是咱們可能獲得的是00123456789這樣的11數,顯然不太像電話號碼。沒事咱們再改進一下,爲何咱們獲得的字符串不像呢?由於通常電話號碼都有固定的頭,例如:136,189,156這樣的,因此咱們能夠把這樣的頭加上,下面咱們來寫一個模擬獲得手機頭的函數。code

DELIMITER $$
create function phone_head() returns char(3)
begin
-- 130 131 132 133 134 135 136 137 138 139 186 187 189 151 157經常使用的手機頭
declare head char(3);
declare bodys varchar(100) default "130 131 132 133 134 135 136 137 138 139 186 187 189 151 157";
declare starts int;
set starts = 1+floor(rand()*15)*4;    
set head = trim(substring(bodys,starts,3));
return head;
end $$
DELIMITER ;

 咱們仍是有字符串來模擬,用空格分開。咱們一共選取了15個號碼頭,每個號碼頭有3位,因此咱們截取字符串的開始位置從1,49····也就是start=1+4*n(0<=n<=14)。上面已經介紹了 rand()函數返回值nfloat 其中 0<=n<1,floor是向下取整字符串

set head = substring(bodys,starts,3);在字符串bodys中從starts位置截取三位

下面咱們來生成電話號碼:string

DELIMITER $$
create function gen_phone() returns varchar(20)
begin
declare phone varchar(20);
set phone = trim(concat(phone_head(),rand_num(8)));
return phone;
end $$
DELIMITER ;

咱們先生成3位電話號碼頭,而後用rand_num(8) 生成8位數字,而後用concat內置函數把他們拼接在一塊兒。io

下面咱們再來寫一個存儲過程來生成100個電話號碼來看一看:function

DELIMITER $$
create procedure insert_phone()
begin
declare i int default 0;
declare phone varchar(20);
set phone = trim(concat(phone_head(),rand_num(8)));
while i<100 do
insert into phone(phone) values(phone);
set i = i+1;
set phone = trim(concat(phone_head(),rand_num(8)));
end while;
end $$
DELIMITER ;

 上面的存儲過程就是想phone表中插入100條咱們寫的函數生成的電話號碼。接下來就是檢驗成果的時候了。仍是先來建立一張表:

DROP TABLE IF EXISTS `phone`;
CREATE TABLE `phone` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `phone` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 調用咱們的存儲過程insert_phone

查看一下咱們是否生成成功:

怎麼樣,是否是看樣子有一點像電話號碼了,咱們之後寫一些簡單的測試數據的時候徹底能夠用MySQL提供給咱們的函數來實現模擬生成測試數據。

相關文章
相關標籤/搜索