今天我们来演示一下使用 MySQL 的存储过程来批量插入数据。
新建数据库
create database bigData;
use bigData;复制
建立数据表 dept 和 emp
-- 建立 dept 表
CREATE TABLE dept(
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,
dname VARCHAR(20) NOT NULL DEFAULT "",
ioc VARCHAR(13) NOT NULL DEFAULT ""
)ENGINE=INNODB DEFAULT CHARSET=GBK;
-- 建立 emp 表
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, *薪水*/
comm DECIMAL(7,2) NOT NULL, *红利*/
deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0 *部门编号*/
)ENGINE=INNODB DEFAULT CHARSET=GBK;复制
设置参数 log_bin_trust_function_creators
创建函数,假如报错:This function has none of DETERMINISTIC ……
由于开启过慢查询日志,因为我们开启了 bin-log,我们就必须为我们的 function 指定一个参数。
# 查看是否开启了
SHOW VARIABLES LIKE 'log_bin_trust_function_creators';
# 临时开启(mysqld 重启之后,参数会失效)
SET GLOBAL log_bin_trust_function_creators = 1;复制
永久开启方法:
Windows 下 my.ini [mysqld] 下加上 log_bin_trust_function_creators=1 Linux 下 etc/my.cnf [mysqld] 下加上 log_bin_trust_function_creators=1
创建函数,保证每条数据都不同
-- 随机产生字符串的 MySQL 函数
delimiter $$$
CREATE FUNCTION rand_string(n INT) RETURNS VARCHAR(255)
BEGIN
DECLARE chars_str VARCHAR(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
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));
SET i = i + 1;
END while;
RETURN return_str;
END $$$
-- 用于随机产生部门编号
delimiter $$$
CREATE FUNCTION rand_num()
RETURNS INT(5)
BEGIN
DECLARE i INT DEFAULT 0;
SET i = FLOOR(100+RAND()*10);
RETURN i;
END $$$
-- 如果要删除函数的话
drop function rand_num;复制
建立存储过程
-- 为 emp 表插入数据建立方法
delimiter $$$
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
SET i = i + 1;
INSERT INTO emp(empno, ename, job, mgr, hiredate, sal, comm, deptno) VALUES ((START + i),rand_string(6),
'SALESMAN', 0001, CURDATE(), 2000, 400, rand_num());
until i = max_num
END repeat;
# 循环之后在提交
COMMIT;
END $$$
-- 执行存储过程,往 dept 表添加随机数据
delimiter $$$
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(deptno,dname,ioc) VALUES ((START + i),rand_string(10),rand_string(8));
until i = max_num
END repeat;
COMMIT;
END $$$
-- 如果要删除掉存储过程的话
drop procedure insert_dept;复制
调用存储过程
-- 先恢复以分号结尾 sql 语句
delimiter ;
-- 往 dept 表中插入数据
call insert_dept(100,10);
-- 往 emp 表中插入数据
call insert_emp(100001,500000);复制
最后说个事
公号算法变了,为防止看不到我的更新
大家帮忙加个星标
点击上方的公众号卡片
再点右上角三个点
就能看到设为星标
算我跪下来求你们
往期精选:
文章转载自蒲东平,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
【MySQL 30周年庆】MySQL 8.0 OCP考试限时免费!教你免费领考券
墨天轮小教习
3418次阅读
2025-04-25 18:53:11
MySQL 30 周年庆!MySQL 8.4 认证免费考!这次是认真的。。。
严少安
923次阅读
2025-04-25 15:30:58
【活动】分享你的压箱底干货文档,三篇解锁进阶奖励!
墨天轮编辑部
545次阅读
2025-04-17 17:02:24
MySQL 8.0 OCP 1Z0-908 考试解析指南(二)
JiekeXu
373次阅读
2025-04-30 17:37:37
MySQL 30 周年庆!MySQL 8.4 认证免费考!这次是认真的。。。
数据库运维之道
309次阅读
2025-04-28 11:01:25
SQL优化 - explain查看SQL执行计划(下)
金同学
303次阅读
2025-05-06 14:40:00
MySQL 8.0 OCP 1Z0-908 考试题解析指南
青年数据库学习互助会
298次阅读
2025-04-30 12:17:54
MySQL 官方准备了 3 个月的羊毛,万万没想到 8 天就被薅秃了,看看JieKeXu怎么说?
青年数据库学习互助会
291次阅读
2025-05-09 10:07:42
MySQL 8.4 新特性深度解析:功能增强、废弃项与移除项全指南
JiekeXu
255次阅读
2025-04-18 20:21:32
4月“墨力原创作者计划”获奖名单公布!
墨天轮编辑部
220次阅读
2025-05-13 16:21:59