Watch 24 Star 34 Fork 0

艺夫 / sql-fakerSQL

Join us
Explore and code with more than 2 million developers,Free private repositories !:)
Sign up
This repository doesn't specify license. Without author's permission, this code is only for learning and cannot be used for other purposes.
用 SQL 编写的在 MySQL/MariaDB 下的伪数据生成函数/过程库。 spread retract

Clone or download
Cancel
Notice: Creating folder will generate an empty file .keep, because not support in Git
Loading...
README.md

生成数据库伪数据的 Faker -- SQL (MySQL/MariaDB) 版

查看帮助

执行脚本后,用:

set names gb2312;
select * from functions;

查看各函数功能及用法。

生成数据函数说明

序号 名称 返回值 功能 用法
1 idno_sp(gender CHAR(2), min_age INT, max_age INT) 可验证的中国身份证号 用于随机生成指定年龄段和性别的中国身份证号 参数 gender: 单个英文字符: “M”或“m”或“男”生成男性身份证号,其它生成女性身份证。min-age: 最小年龄;max-age: 最大年龄。
2 idno_g(gender CHAR(2)) 可验证的中国身份证号 用于生成指定性别的 100 岁以内的中国身份证。 参数 gender: 单个英文字符: “M”或“m”或“男”生成男性身份证号,其它生成女性身份证。
3 idno() 可验证的中国身份证号 用于随机生成任何性别任何年龄的合法的身份证号 本函数无参数,直接调用 idno() 即可。
4 gender() 中文性别 用于随机生成中文性别 本函数无参数,直接调用 gender() 即可。
5 first_name(gender CHAR(1)) 中文名字。 用于随机生成中文名字。 参数 gender,单个英文字符: “M”或“m”或“男”生成男性名字,其它生成女性名字。
6 last_name() 中文姓氏。 用于随机获取中文姓氏。 本函数无参数,直接调用 last_name() 即可。
7 pname (gender CHAR(1)) 中文姓名。 用于随机生成中文姓名。 参数 gender,单个英文字符: “M”或“m”或“男”生成男性姓名,其它生成女性姓名。
8 phone() 中国大陆格式电话号码。 用于随机生成电话号码。 本函数无参数,直接调用 phone() 即可。
9 mobile() 中国大陆格式手机号码。 用于生成手机号码。 本函数无参数,直接调用 mobile() 即可。
10 email() 电邮地址。 用于生成合法的电邮地址。 本函数无参数,直接调用 email() 即可。
11 city() 中国省市自治区直辖市首府城市。 用于随机获取中国省市自治区直辖市首府城市。 本函数无参数,直接调用 city() 即可。
12 address() 中国格式地址。 用于生成中国格式地址。 本函数无参数,直接调用 address() 即可。
13 zip() 邮政编码 生成中国大陆邮政编码 本函数无参数,直接调用 zip() 即可。
14 qq() QQ 号。 用于随机生成 QQ 号。 本函数无参数,直接调用 qq() 即可。
15 wechat() 微信号(手机格式) 用于随机生成微信号。 本函数无参数,直接调用 wechat() 即可。
16 future(_from INT, _to INT, what CHAR(1)) 未来某个日期。 用于生成未来某个日期。 参数-- _from: 最小数目;_to:最大数目;what: “Y” 表示年,“M”表示月,“D”表示天。 例如:future(3,10,"Y") 表示获取未来 3 到 10 年的任何一个日期。
17 past(_from INT, _to INT, what CHAR(1)) 过去某个日期。 用于生成过去某个日期。 参数-- _from: 最小数目;_to:最大数目;what: “Y” 表示年,“M”表示月,“D”表示天。 例如:past(3,10,"Y") 表示获取 3 年前到 10 年的任何一个日期。

生成函数用例

1、idno_sp

-- 生成 18 到 60 岁的男性公民的身份证号
select faker.idno_sp('M',18,60);
+--------------------------+
| faker.idno_sp('M',18,60) |
+--------------------------+
| 519518198106270013       |
+--------------------------+
1 row in set (0.001 sec)

2、idno_g

-- 获得1岁到100岁的女性公民的身份证号
select faker.idno_g('');
+--------------------+
| faker.idno_g('')   |
+--------------------+
| 387773201406270422 |
+--------------------+
1 row in set (0.001 sec)

-- 获得1岁到100岁的男性公民的身份证号
select faker.idno_g('男');
+--------------------+
| faker.idno_g('男') |
+--------------------+
| 115361197406270176 |
+--------------------+
1 row in set (0.000 sec)

3、idno

-- 获得100岁以内任意合法的身份证号
select idno();
+--------------------+
| idno()             |
+--------------------+
| 483158199506270095 |
+--------------------+
1 row in set (0.001 sec)

4、gender

-- 随机获得中文性别
select gender();
+----------+
| gender() |
+----------+
| 男       |
+----------+
1 row in set (0.000 sec)

5、first_name

-- 随机获得男性名字

select first_name('男');
+------------------+
| first_name('男') |
+------------------+
| 昊天             |
+------------------+
1 row in set (0.000 sec)

-- 随机获得女性名字

select first_name('');
+----------------+
| first_name('') |
+----------------+
| 佩瑶           |
+----------------+
1 row in set (0.000 sec)

6、last_name

-- 随机获得中文姓氏

select last_name();
+-------------+
| last_name() |
+-------------+
| 崔          |
+-------------+
1 row in set (0.000 sec)

7、pname

-- 随机获得女性全名

select pname('');
+-----------+
| pname('') |
+-----------+
| 孟琚瑶    |
+-----------+
1 row in set (0.000 sec)

-- 随机获得男性全名
select pname('m');
+------------+
| pname('m') |
+------------+
| 张浩然     |
+------------+
1 row in set (0.000 sec)

8、phone

-- 随机获得电话

select phone();
+---------------+
| phone()       |
+---------------+
| 0733-94549059 |
+---------------+
1 row in set (0.000 sec)

9、mobile

-- 随机获得手机号码
select mobile();
+---------------+
| mobile()      |
+---------------+
| 180 8095 9257 |
+---------------+
1 row in set (0.000 sec)

10、email

-- 随机获得电邮地址

select email();
+---------------------------+
| email()                   |
+---------------------------+
| ssedluctus@guemassaes.com |
+---------------------------+
1 row in set (0.000 sec)

11、city

-- 随机获取省、自治区、直辖市、港澳台的首府城市

select city();
+--------------+
| city()       |
+--------------+
| 山东省济南市 |
+--------------+
1 row in set (0.001 sec)

12、address

-- 随机生成中国地址

select address();
+------------------------------+
| address()                    |
+------------------------------+
| 内蒙古呼和浩特市雨泽街7935号 |
+------------------------------+
1 row in set (0.000 sec)

13、zip

-- 随机生成中国大陆格式的邮政编码

select zip();
+--------+
| zip()  |
+--------+
| 184226 |
+--------+
1 row in set (0.000 sec)

14、qq

-- 随机生成 QQ 号

select qq();
+-----------+
| qq()      |
+-----------+
| 220696835 |
+-----------+
1 row in set (0.000 sec)

15、wechat

-- 随机生成微信号(手机号码)
select wechat();
+--------------+
| wechat()     |
+--------------+
| 180 5534 900 |
+--------------+
1 row in set (0.000 sec)

16、future

-- 测试日期: 2019-06-27
-- 获取未来 3 到 5 年区间的一个日期
select future(3,5,'Y');
+-----------------+
| future(3,5,'Y') |
+-----------------+
| 2022-06-27      |
+-----------------+
1 row in set, 1 warning (0.000 sec)

-- 获取未来 3 到 5 个月区间的一个日期
select future(3,5,'M');
+-----------------+
| future(3,5,'M') |
+-----------------+
| 2019-09-27      |
+-----------------+
1 row in set, 1 warning (0.000 sec)

-- 获取未来 3 到 5 天区间的一个日期
select future(3,5,'D');
+-----------------+
| future(3,5,'D') |
+-----------------+
| 2019-06-30      |
+-----------------+
1 row in set, 1 warning (0.000 sec)

-- 获取未来 3 到 5 天区间的一个日期(写颠倒也行)
select future(5,3,'D');
+-----------------+
| future(5,3,'D') |
+-----------------+
| 2019-07-02      |
+-----------------+
1 row in set, 1 warning (0.000 sec)

17、past

-- 测试日期: 2019-06-27
-- 获得 7 到 10 年前的任何日期
select past(7,10,'Y');
+----------------+
| past(7,10,'Y') |
+----------------+
| 2009-06-27     |
+----------------+
1 row in set, 1 warning (0.000 sec)

-- 获得 7 到 10 个月前的任何日期
select past(7,10,'M');
+----------------+
| past(7,10,'M') |
+----------------+
| 2018-08-27     |
+----------------+
1 row in set, 1 warning (0.000 sec)

-- 获得 7 到 10 天前的任何日期
select past(7,10,'D');
+----------------+
| past(7,10,'D') |
+----------------+
| 2019-06-20     |
+----------------+
1 row in set, 1 warning (0.000 sec)

-- 获得 7 到 10 天前的任何日期(颠倒也行)
select past(10,7,'D');
+----------------+
| past(10,7,'D') |
+----------------+
| 2019-06-20     |
+----------------+
1 row in set, 1 warning (0.000 sec)

辅助函数说明

序号 名称 返回值 功能 用法
1 date_from_id_helper(id_no VARCHAR(30)) 日期 从给定的身份证号中取出出生日期 参数:身份证号(非法身份证号会报错)
2 gender_from_id_helper(id_no VARCHAR(30)) 中文性别 从给定的身份证号中取出性别 参数:身份证号(非法身份证号会报错)

辅助函数用例

1、date_from_id_helper

-- 从身份证中获取出生日期

select idno();
+--------------------+
| idno()             |
+--------------------+
| 399683199506270324 |
+--------------------+
1 row in set (0.001 sec)

select date_from_id_helper('399683199506270324');
+-------------------------------------------+
| date_from_id_helper('399683199506270324') |
+-------------------------------------------+
| 1995-06-27                                |
+-------------------------------------------+
1 row in set (0.000 sec)

2、gender_from_id_helper

-- 从身份证号获得性别
select gender_from_id_helper('399683199506270324');
+---------------------------------------------+
| gender_from_id_helper('399683199506270324') |
+---------------------------------------------+
| 女                                          |
+---------------------------------------------+
1 row in set (0.000 sec)

脚本中包含的测试内容

-- TEST

CREATE TABLE `staff`(
    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
    `cid` CHAR(18) NOT NULL,
    `name` VARCHAR(50) NOT NULL,
    `gender` CHAR(2) NOT NULL,
    `birth_date` DATE NOT NULL,
    `hired_at` DATE NOT NULL,
    `conttact_due_at` DATE NOT NULL,
    `email` VARCHAR(100) NOT NULL,
    `work_phone` VARCHAR(50) NOT NULL,
    `mobile` VARCHAR(50),
    `qq` VARCHAR(50),
    `wechat` VARCHAR(50),
    `address` VARCHAR(200),
    `zip` CHAR(6),
    PRIMARY KEY (`id`)
);

DELIMITER $$

CREATE PROCEDURE fill_fake_staff_data()
BEGIN
    DECLARE _count INT;
    SET _count=1000;
    SELECT faker.gender() INTO @gender;
    SELECT faker.idno_sp(@gender,18,55) INTO @idno;
    WHILE _count>0 DO
        INSERT INTO `staff` VALUES
        (
            NULL,  -- id
            @idno,  -- cid 身份证号
            faker.pname(@gender), -- name 姓名
            @gender, -- gender 性别
            faker.date_from_id_helper(@idno), -- birth_date 出生日期
            faker.past(3,10,'Y'), -- hired_date 雇用日期
            faker.future(3,5,'Y'), -- contract_due_at 合同到期日期
            faker.email(), -- email 电邮
            faker.phone(), -- work_phone 工作电话
            faker.mobile(), -- mobile 手机
            faker.qq(), -- qq
            faker.wechat(), -- wechat 微信
            faker.address(), -- address 住址
            faker.zip() -- zip 邮编
        );
        SET _count=_count-1;
    END WHILE;
END

$$

DELIMITER ;

CALL fill_fake_staff_data();

SET NAMES GB2312;  -- 如果不在 Windows 下,或您的 Windows 控制台使用了 UTF8 编码,请注释掉此行。

SELECT COUNT(*) FROM `staff`;
SELECT * FROM `staff` LIMIT 10;

Comments ( 0 )

Sign in for post a comment

SQL
1
https://gitee.com/artman/sql-faker.git
git@gitee.com:artman/sql-faker.git
artman
sql-faker
sql-faker
master

Help Search