存储过程:The stored procedure

结构

CREATE
[DEFINER = { user | CURRENT_USER }]
 PROCEDURE stored_procedure_name ([proc_parameter[,...]])
[characteristic ...] routine_body

proc_parameter(参数列表):
[ IN(输入参数) | OUT(输出参数) | INOUT(即可输入也可输出) ] param_name(参数名称) type(参数类型) characteristic(指定存储过程特性):
COMMENT 'string'(注释信息)
| LANGUAGE SQL(说明body部分由SQL语句组成,LANGUAGE可选值只有SQL)
| [NOT] DETERMINISTIC(指明存储过程执行结果是否确定 默认值:NOT DETERMINISTIC)
| { CONTAINS SQL(默认 说明子程序包含SQL语句,但是不包含写数据语句) | NO SQL(说明子程序不包含SQL语句) | READS SQL DATA(说明子程序包含读数据读数据语句) | MODIFIES SQL DATA(说明子程序包含写数据语句) }(指定子程序使用存储过程的限制)
| SQL SECURITY { DEFINER(默认 只有定义者才能执行) | INVOKER(拥有权限的调用者才可以执行) }(指明谁有权限执行)
routine_body(SQL代码内容,可以使用BEGIN...END表示SQL代码的开始和结束):
  Valid SQL routine statement [begin_label:] BEGIN
  [statement_list]
    ……
END [end_label]

例子

#无参数
create procedure myFist_proc() ## 创建存储过程
begin
//....
end; show create procedure myFist_proc();
call myFist_proc(); #带有输出参数的存储过程
create procedure mySecond_proc(out sumStudent int )
begin
select count(*) into sumStudent from score where grade>80;
end; call mySecond_proc(@sumStudent);
select @sumStudent; ##带有输入参数的存储过程 create procedure myThird_proc(in minScore int ,out sumStudent int)# 创建存储过程
begin
select count(*) into new_table_name from old_table_name where grade>minScore;#从一个旧表中选取数据,然后把数据插入另一个新表中
end; call myThird_proc(90); #大于90的
select @sumStudent;

创建1000万数据的测试表(电脑问题非常慢)

#创建表
CREATE TABLE `big_data_test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(16) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`email` varchar(64) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`),
KEY `name_age` (`email`,`age`) USING BTREE,
KEY `email` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8; #创建存储过程,开始插入数据
CREATE PROCEDURE `insert_data_p`(IN num INT)
BEGIN
DECLARE n INT DEFAULT 1;#申明变量n
WHILE n <= num DO #当n小于传入的参数时执行循环插入
INSERT INTO big_data_test(name,age,email)values(concat('alex',n),rand()*50,concat('alex',n,'@qq.com'));
set n=n+1;
end while;
ENd;  #调用存储过程,插入1000万条数据(总耗时:382.614 sec)
CALL insert_data_p(10000000);

这个超快  MySQL快速生成100W条测试数据转载连接

CREATE TABLE `vote_record` (
`id` INT (11) NOT NULL AUTO_INCREMENT,
`user_id` VARCHAR (20) NOT NULL,
`vote_id` INT (11) NOT NULL,
`group_id` INT (11) NOT NULL,
`create_time` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `index_user_id` (`user_id`) USING HASH
) ENGINE = INNODB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8; #内存表
CREATE TABLE `vote_record_memory` (
`id` INT (11) NOT NULL AUTO_INCREMENT,
`user_id` VARCHAR (20) NOT NULL,
`vote_id` INT (11) NOT NULL,
`group_id` INT (11) NOT NULL,
`create_time` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `index_id` (`user_id`) USING HASH
) ENGINE = MEMORY AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8; #创建函数及存储过程
CREATE FUNCTION `rand_string`(n INT) RETURNS varchar(255) CHARSET latin1
BEGIN
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()*62 ),1));
SET i = i +1;
END WHILE;
RETURN return_str;
END; CREATE PROCEDURE `add_vote_memory`(IN n int)
BEGIN
DECLARE i INT DEFAULT 1;
WHILE (i <= n ) DO
INSERT into vote_record_memory (user_id,vote_id,group_id,create_time ) VALUEs (rand_string(20),FLOOR(RAND() * 1000),FLOOR(RAND() * 100) ,now() );
set i=i+1;
END WHILE;
END; #插入内存表
CALL add_vote_memory(1000000) #插入普通表中
INSERT into vote_record SELECT * from vote_record_memory #php.ini改下内存
tmp_table_size=1G
max_heap_table_size = 1G 或者动态设置
SET GLOBAL tmp_table_size=2147483648; (无效果?)
SET GLOBAL max_heap_table_size=2147483648;(无效果?)
或者:
set session tmp_table_size=1024*1024*1024; (查看:show variables like '%tmp_table%';)
set session max_heap_table_size=1024*1024*1024; (查看:show variables like '%max_heap%';)
tmp_table_size 控制内存临时表的最大值,超过限值后就往硬盘写,写的位置由变量 tmpdir 决定 
max_heap_table_size 用户可以创建的内存表(memory table)的大小.这个值用来计算内存表的最大行数值。
查看:show variables like '%tmp%';
max_tmp_tables=32 #客户端可以同时保持打开的最大临时表数
E
RROR 1114 (HY000): The table 'vote_record_memory' is full 就是因为上面的值设置的太小

mysql 创建存储过程 创建1000w测试数据表的更多相关文章

  1. mysql创建存储过程,批量建表分表00到99

    这里以sqlyong为软件示例: --创建存储过程DELIMITER $$ CREATE PROCEDURE `createTablesWithIndex`() BEGIN DECLARE `@i` ...

  2. 用MYSQL的存储过程创建百万级测试数据表

    创建随机字符串函数,便于创建名称 DROP function if EXISTS rand_string; #创建一个指定字符个数的函数 create function rand_string(n I ...

  3. Mysql使用存储过程创建测试数据

    一.概述 存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集.其存储在数据库中,经过第一次编译后调用不需要再次编译,用户通过指定存储过程的名字并给出 ...

  4. 用NaviCat创建存储过程批量添加测试数据

    打开navicat连接上数据库,然后打开左上角函数,新建一个函数. BEGIN DECLARE i int; --声明变量 DECLARE groupid int; set i=LAST_INSERT ...

  5. MySql使用存储过程清除数据库所有表数据,保存数据结构

    BEGIN DECLARE strClear VARCHAR(256); DECLARE done INT DEFAULT 0; #定义游标 DECLARE curOne CURSOR FOR sel ...

  6. mysql写存储过程并定时调用

    设置一个定时任务:运行以下SQL -- 创建一个表test:字段endtime CREATE TABLE test (endtime DATETIME);   -- 创建函数 :向test插入endt ...

  7. mysql -- 创建存储过程 往数据表中新增字段

    需求: 往某数据库的某个表中新增一个字段(若该字段已存在,则不做操作:若该字段不存在,则新增) 百度了n久,没有符合要求的例子,只有参考加自己琢磨,最终终于给弄出来了,以下是几个版本的更迭 第一版: ...

  8. mysql命令行创建存储过程命令行定时执行sql语句

    mysql -uroot -p show databases; use scm; show tables; show procedure status; 其他命令: SHOW VARIABLES LI ...

  9. 创建MySQL用户 赋予某指定库表的权限 flush privileges才能生效!!!!;@'localhost'授权本地,@'%'授权远程

    update ERROR 1364 (HY000): Field 'ssl_cipher' doesn't have a default value 建议使用GRANT语句进行授权,语句如下: gra ...

随机推荐

  1. Tomcat系列(2)——Tomcat文件目录7个

    核心部分 bin (运行脚本) conf (配置文件) lib (核心库文件) logs (日志目录) temp (临时目录) webapps (自动装载的应用程序的目录) work (JVM临时文件 ...

  2. Thunk

    Thunk https://en.wikipedia.org/wiki/Thunk In computer programming, a thunk is a subroutine used to i ...

  3. D3 learning notes

    D3 https://d3js.org/ 数据驱动文档显示, 利用 SVG HTML CSS技术. D3.js is a JavaScript library for manipulating doc ...

  4. ArcGIS——使用符号级别区分重叠的面图层

    1.有这样一个面图层shp文件(区域相重叠),需要做出如下右图的效果: 2.导入shp文件后,右键shp文件,属性->符号系统 3.高级->符号级别 将面积最大的图层的级别设为最小,面积最 ...

  5. PHP数组函数详解大全

    一.数组操作的基本函数 数组的键名和值 array_values($arr);获得数组的值 array_keys($arr);获得数组的键名 array_flip($arr);数组中的值与键名互换(如 ...

  6. app每次更新版本时调用js代码提示用户下载更新

    var url = '网络地址'; //APP升级 var wait; function update(){ //判断操作系统 var system = 'android'; if(mui.os.io ...

  7. easyui 菜单树搜索

    //树形菜单搜索方法    function searchTree(treeObj,parentNode,searchCon){        var children;        for(var ...

  8. 415 DOM 查找列表框、下拉菜单控件、对表格元素/表单控件进行增删改操作、创建元素并且复制节点与删除、 对表格操作、通用性和标准的事件监听方法(点击后弹窗效果以及去掉效果)

    DOM访问列表框.下拉菜单的常用属性: form.length.options.selectedindex.type       使用options[index]返回具体选项所对应的常用属性:defa ...

  9. 搜索表字段包含某字符串的SQL和监控Oracle数据库的SQL。

    1.第一个SQL 背景:需要找到SQL Server数据库中,包含某个字符串的表,输出表和包含该字符串的列. )='=' --这里填要搜索的字符串 DECLARE @sql NVARCHAR(MAX) ...

  10. 添加一个非模态对话框在revit中

    RequestHandler handler = new RequestHandler(); ExternalEvent exEvent = ExternalEvent.Create(handler) ...