案例:给数据库database下的score表增加10000条测试数据。
一、准备工作
工具下载:SQLyog,参考文章SQLyog入门教程:安装与使用
二、SQL语句
[code]DROP PROCEDURE IF EXISTS proc_initData;DELIMITER $CREATE PROCEDURE proc_initData()BEGINDECLARE i INT DEFAULT 1;WHILE i<=10000 DOINSERT INTO score(id,course,teacher,marks,grade,examdate)VALUES(i,ELT(CEILING(RAND()*3), \'语文\', \'数学\', \'英语\'),CASE course WHEN \'语文\' THEN \'张三\' WHEN \'数学\' THEN ELT(CEILING(RAND()*2), \'李四\', \'王五\') WHEN \'英语\' THEN \'Tony\' END,FLOOR(RAND()*101),CASE WHEN marks > 90 THEN \'优秀\' WHEN marks > 80 THEN \'良好\' WHEN marks >= 60 THEN \'及格\' ELSE \'不及格\' END,DATE_FORMAT(DATE_SUB(NOW(), INTERVAL FLOOR(RAND()*30) DAY),\'%Y-%m-%d\'));SET i = i+1;END WHILE;END $DELIMITER;CALL proc_initData();
三、思路分析
1、查看表的创建语句创建新表
为预防出错,我们不在原表上进行操作,而是通过查询原表的创建语句新建一张相同的test_score表。
[code]SHOW CREATE TABLE `score`; \'查看原表score的创建语句\'创建新表test_scoreCREATE TABLE `test_score` (`id` VARCHAR(4) NOT NULL COMMENT \'学号\',`course` VARCHAR(20) DEFAULT NULL COMMENT \'学科\',`teacher` VARCHAR(20) DEFAULT NULL COMMENT \'教师\',`marks` INT DEFAULT 0 COMMENT \'分数\',`grade` VARCHAR(20) DEFAULT NULL COMMENT \'等级\',`examdate` DATE DEFAULT NULL COMMENT \'考试日期\',PRIMARY KEY (`id`)) ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT=\'成绩表\';
2、存储过程批量插入数据
简易的存储过程如下:
[code]\'创建MySQL存储过程DROP PROCEDURE IF EXISTS proc_initData;DELIMITER $CREATE PROCEDURE proc_initData()BEGINDECLARE i INT DEFAULT 1;WHILE i<=10 DOINSERT INTO test_score(id) VALUES(i);SET i = i+1;END WHILE;END $DELIMITER;\'调用存储过程CALL proc_initData();
3、优化存储过程中的插入语句,给所有字段设值。
>> 查询表所有字段名
[code]SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = \'test_score\' AND TABLE_SCHEMA = \'database\'; \'查看database数据库下test_score表所有字段名
>> 查询字段的不同值
[code]SELECT DISTINCT course FROM `test_score`; \'查看test_score表的course字段的不同值
>> 随机插入指定内容
ELT(n, str1, str2, str3,…): 如果n=1,则返回str1;如果n=2,则返回str2;依次类推。如果n小于1或大于参数个数,返回NULL。
CEILING(RAND()*n): 随机生成[1-n]范围内的一个整数。
[code]ELT(CEILING(RAND()*3), \'语文\', \'数学\', \'英语\') \'在语文、数学、英语中随机取值
>> 分类判断:Case函数的两种格式
[code]CASE course WHEN \'语文\' THEN \'张三\' WHEN \'数学\' THEN ELT(CEILING(RAND()*2), \'李四\', \'王五\') WHEN \'英语\' THEN \'Tony\' ENDCASE WHEN marks > 90 THEN \'优秀\' WHEN marks > 80 THEN \'良好\' WHEN marks >= 60 THEN \'及格\' ELSE \'不及格\' END
>> 取某一范围随机数
FLOOR(i + RAND() * (j – i + 1)) : 随机生成[i, j]范围内的一个整数。
[code]FLOOR(RAND()*101) \'随机生成[0, 100]范围内的整数
4、 清除表数据
DELETE FROM `table_name`;
5、删除测试表
DROP TABLE table_name;