mysql使用存储过程&函数实现批量插入

以下是我为了自己学方便建的笔记,都是在其他博主的主页下看到的,自学笔记,有不对的可以指出

表结构如下:

create table dept(

  id int unsigned primary key auto_increment,

// ID列为无符号整型,该列值不可以为空,并不可以重复,而且自增。  

deptno mediumint unsigned not null default 0,

//deptno列为无符号中等大小整数,该值不可以为空,没有数据传入时则使用默认值0来设置该字段

  dname varchar(20) not null default "",

//dname列为字符型,长度设定为20位,该值不可以为空,没有数据传入时使用默认值空来设置该字段

  loc varchar(13) not null default ""

//dname列为字符型,长度设定为13位,该值不可以为空,没有数据传入时使用默认值空来设置该字段

)engine=MyISAM default charset=utf8;

//ENGINE=INNODB 表示将数据库的引擎设置为MyISAM ,DEFAULT CHARSET=utf8表示设置数据库的默认字符集为utf8

 

create table emp(

  id int unsigned primary key auto_increment,

  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, /*薪水*/

//sal列为7位数字型,两位小数点,不可以为空

  comm decimal(7,2) not null,/*红利*/

  deptno mediumint unsigned not null default 0/*部门编号*/

)engine=MyISAM default charset=utf8;

 

CREATE TABLE salgrade( /*工资级别表*/

 grade MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,

 losal DECIMAL(17,2) NOT NULL,

 hisal DECIMAL(17,2) NOT NULL

)ENGINE=MyISAM DEFAULT CHARSET=utf8;

 

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);

 

Ps:

PRIMAPY是主键的意思,表示定义的该列值在表中是唯一的意思,不可以有重复。

UNSIGNED是无符号的意思,代表该字段没有正负。

AUTO_INCREMENT可以理解为自动递增的意思,每增加一条记录,值会自动加1。(例如在上面的例子中,ID列每增加一条记录,便会从100自增) 。

自增长字段必须是整数
一张表最多只能有一个自增长

 

TINYINT:一个很小的整数。有符号的范围是-128到127,无符号的范围是0到255

    SMALLINT:一个小整数。有符号的范围是-32768到32767,无符号的范围是0到65535

    MEDIUMINT:一个中等大小整数。有符号的范围是-8388608到8388607,无符号的范围是0到16777215

    INT:一个正常大小整数。有符号的范围是-2147483648到2147483647,无符号的范围是0到4294967295

    BIGINT:一个大整数。有符号的范围是-9223372036854775808到9223372036854775807,无符号的范围是0到18446744073709551615

 

    至于类型后面的数值,该这样理解,比如:

    tinyint(1)和 tinyint(3)没什么区别,占用字节都是一位,存储范围都是一样的,1和3分别表示显示长度,那显示长度该怎么理解呢?

tinyint(3) zerofill ,当插入的数据少于3位的时候,左边自动补零,这才是限制显示长度啊,其他的都不变,比如.tinyint(1),和tinyint(3)没什么区别,存123都能存的下,而如果tinyint(3) zerofill 的话,插入值 12,会存储012,zerofill自动左边补零,这才是限制显示长度

 

 

#随机产生字符串

#定义一个新的命令结束符

delimiter $$

Delimiter就是告诉MySQL解释器,该段命令是否已经结束了,MySQL是否可以执行了。默认情况下,delimiter是分号;。在命令行客户端中,如果有一行命令以分号结束,那么回车后,mysql将会执行该命令。

事先把delimiter换成其它符号,如//或$$,这样只有当//出现之后,mysql解释器才会执行这段语句

#删除自定的函数

drop function rand_string $$

创建函数:

#rand_string(n INT) rand_string 是函数名(n INT)  //该函数传参一个整数

create function rand_string(n INT)

returns varchar(255) #该函数会返回一个字符串

Begin

#chars_str定义一个 变量

declare chars_str varchar(100) default

 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';

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()*52),1));

//Java中提供的substring方法截取字符串

截取的字符串从chars_str开始,到floor(1+rand()*52)结束

floor函数,floor(1+rand()*52小于等于1+rand()*52,且于1+rand()*52最接近的整数

mysql使用存储过程&函数实现批量插入

 

JavaScript concat() 方法用于连接两个或多个数组

mysql使用存储过程&函数实现批量插入

 

 set i = i +1;

 end while;

return return_str;

end $$

 

delimiter ;

select rand_string(6);

 

# 随机产生部门编号

delimiter $$

drop  function rand_num $$

 

再来一个函数

create function rand_num( )

returns int(5)

begin

 declare i int default 0;

 set i = floor(10+rand()*500);

return i;

 end $$

 

delimiter ;

select rand_num();

 

#******************************************

#向emp表中插入记录(海量的数据)

 

 

delimiter $$

drop procedure insert_emp $$

 

创建存储过程

#随即添加雇员[光标]  360w

create procedure insert_emp(in start int(10),in max_num int(10))

begin

declare i int default 0;

#set autocommit = 0 把autocommit设置成0

set autocommit = 0;

Repeat

mysql使用存储过程&函数实现批量插入

 

set i = i +1;

Insert into emp values

((start+i),rand_string(6),'SALESMAN',0001,curdate(),2000,400,rand_num());

mysql使用存储过程&函数实现批量插入

 

until i = max_num

end repeat;

commit;

//使用COMMIT

一般的MySQL语句都是直接针对数据库表执行和编写的。这就是所谓的隐含提交(implicit commit),即提交(写或保存)操作是自动进行的。但是,在事务处理块中,提交不会隐含地进行。为进行明确的提交,使用 COMMIT 语句,隐含事务关闭 当 COMMIT 或 ROLLBACK 语句执行后,事务会自动关闭(将来的更改会隐含提交)。

 

mysql使用存储过程&函数实现批量插入

end $$

 

delimiter ;

#调用刚刚写好的函数, 1800000条记录,从100001号开始

call insert_emp(100001,4000000);

 

 

#**************************************************************

#  向dept表中插入记录

 

delimiter $$

drop procedure insert_dept $$

 

 

create procedure insert_dept(in start int(10),in max_num int(10))

begin

declare i int default 0;

 set autocommit = 0;  

 repeat

 set i = i + 1;

 insert into dept values ((start+i) ,rand_string(10),rand_string(8));

  until i = max_num

 end repeat;

   commit;

 end $$

 

 

delimiter ;

call insert_dept(100,10);

 

 

 

 

 

#------------------------------------------------

#向salgrade 表插入数据

delimiter $$

drop procedure insert_salgrade $$

create procedure insert_salgrade(in start int(10),in max_num int(10))

begin

declare i int default 0;

 set autocommit = 0;

 ALTER TABLE emp DISABLE KEYS;  

 repeat

 set i = i + 1;

 insert into salgrade values ((start+i) ,(start+i),(start+i));

  until i = max_num

 end repeat;

   commit;

 end $$

delimiter ;

#测试不需要了

#call insert_salgrade(10000,1000000);