Mysql海量数据表的快速生成(1000万条记录)
开篇如果你不能向一个六岁的孩子解释清楚,那么其实你自己根本没弄懂。这句话很适合我们这些技术人,程序员的世界里不应该出现模糊的概念,遇到一些拿捏不准的东西需要及时理解透彻。Mysql是一种较为常见的数据库,开源并且轻巧,适合大多数中小型互联网公司。我们可能熟悉建一张数据不是太多的表,但是让你在Mysql的dos命令下快速建一张数据不同的表格,是不是也能做到呢?新建一个表格名为(dept)CREATE
·
开篇
如果你不能向一个六岁的孩子解释清楚,那么其实你自己根本没弄懂。这句话很适合我们这些技术人,程序员的世界里不应该出现模糊的概念,遇到一些拿捏不准的东西需要及时理解透彻。
Mysql是一种较为常见的数据库,开源并且轻巧,适合大多数中小型互联网公司。我们可能熟悉建一张数据不是太多的表,但是让你在Mysql的dos命令下快速建一张数据不同的表格,是不是也能做到呢?
新建一个表格名为(dept)
CREATE TABLE dept( /*部门表*/
deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,
dname VARCHAR(20) NOT NULL DEFAULT "",
loc VARCHAR(13) NOT NULL DEFAULT ""
) ;
在建一个表名为emp表
#创建表EMP雇员
CREATE TABLE emp
(empno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0, /*编号*/
ename VARCHAR(20) NOT NULL DEFAULT "", /*名字*/
job VARCHAR(9) NOT NULL DEFAULT "",/*工作*/
mgr MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,/*上级编号*/
hiredate DATE NOT NULL,/*入职时间*/
sal DECIMAL(7,2) NOT NULL,/*薪水*/
comm DECIMAL(7,2) NOT NULL,/*红利*/
deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0 /*部门编号*/
) ;
在创建一个工资级别表salgrade
#工资级别表
CREATE TABLE salgrade
(
grade MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,
losal DECIMAL(17,2) NOT NULL,
hisal DECIMAL(17,2) NOT NULL
);
然后像工资级别表插入数据
#测试数据
INSERT INTO salgrade VALUES (1,700,1200);
INSERT INTO salgrade VALUES (2,1201,1400);
INSERT INTO salgrade VALUES (3,1401,2000);
INSERT INTO salgrade VALUES (4,2001,3000);
INSERT INTO salgrade VALUES (5,3001,9999);
delimiter $$命令结束标志。
二.创建一个函数
#创建一个函数,名字 rand_string,可以随机返回我指定的个数字符串
create function rand_string(n INT)
returns varchar(255) #该函数会返回一个字符串
begin
#定义了一个变量 chars_str, 类型 varchar(100)
#默认给 chars_str 初始值 'abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ'
declare chars_str varchar(100) default
'abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ';
declare return_str varchar(255) default '';
declare i int default 0;
while i < n
do
# concat 函数 : 连接函数mysql函数
set return_str =concat(return_str,substring(chars_str,floor(1+rand()*52),1));
set i = i + 1;
end while;
return return_str;
end $$
//简单解释一下这段代码的意思:
自定义函数目的:返回一个指定长度的随机字符串。
chars_str:初始化长度为52位字符。
Mysql定义变量和我们平时使用的C或者Java不一样,因为人家毕竟也算一门语言,所以风格自然也有所变化。
对于一个变量的使用需要先用declarer声明一个变量
declare chars_str varchar(100) default
然后就是一个while函数循环,通过concat()函数的拼接,返回一个指定长度n的串串。
接着继续创建一个自定义函数:
#这里我们又自定了一个函数,返回一个随机的部门号
create function rand_num( )
returns int(5)
begin
declare i int default 0;
set i = floor(10+rand()*500);
return i;
end $$
#创建一个存储过程, 可以添加雇员
create procedure insert_emp(in start int(10),in max_num int(10))
begin
declare i int default 0;
#set autocommit =0 把autocommit设置成0
#autocommit = 0 含义: 不要自动提交
set autocommit = 0; #默认不提交sql语句
repeat
set i = i + 1;
#通过前面写的函数随机产生字符串和部门编号,然后加入到emp表
insert into emp values ((start+i) ,rand_string(6),'SALESMAN',0001,curdate(),2000,400,rand_num());
until i = max_num
end repeat;
#commit整体提交所有sql语句,提高效率
commit;
end $$
执行:
call insert_emp(100001,8000000)$$
大约需要6-10分钟能执行完(本人新买电脑4分多)
over
ps撸出来的代码,才有意义。
更多推荐
已为社区贡献1条内容
所有评论(0)