MySQL快速生成大量数据的SQL--存储过程
一个快速插入大量数据的存储过程sql
用于其他表改吧改吧基本能用
-- 整个执行包裹在一个事务中,每次循环insert插入一条数据 drop PROCEDURE if exists batchInsert; DELIMITER $$ create PROCEDURE batchInsert(n int) begin declare v int default 1; declare randTitle varchar(255) default ''; declare randContent varchar(255) default ''; declare randStatus int default 0; -- 模拟数据随便找的图 declare fixdImg varchar(255) default 'https://img2.woyaogexing.com/2022/05/11/13a96b447bb44741bf1231472c41fd43!400x400.jpeg'; SET autocommit=0; while v <= n do set randTitle = concat('标题-',substr(md5(rand()), 1, 10)); set randContent = uuid(); set randStatus = floor(rand()*6); insert into t_bigdata(`title`, `content`, `status`, `img_url`) values(randTitle, randContent, randStatus, fixdImg); set v = v + 1; end while; SET autocommit=1; end $$ DELIMITER ;
简单说明:
- DELIMITER $$ :修改分隔符,默认为分号,存储过程内部出现的分号会被认为是一条sql去执行,而不能正常创建存储过程了,修改下最后再恢复
- declare :声明局部变量,必须写在begin紧接着的后面,随用随定义会报错无法编译通过
- SET autocommit=0; :开启事务
调用:
-- 参数为生成数据条数 call batchInsert(1000000);
表结构:
CREATE TABLE `t_bigdata` ( `id` bigint(11) unsigned NOT NULL AUTO_INCREMENT, `title` varchar(255) DEFAULT NULL COMMENT '标题', `content` varchar(255) DEFAULT NULL COMMENT '内容', `status` int(11) DEFAULT NULL COMMENT '状态', `img_url` varchar(255) DEFAULT NULL COMMENT '图片', `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), KEY `idx_title` (`title`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=4601019 DEFAULT CHARSET=utf8mb4 COMMENT='大数据表';
再一个拼接values方式批量插入的存储过程:
drop procedure if exists batchInsertVals; delimiter $$ -- 拼接values方式批量插入 create procedure batchInsertVals(n int, m int) begin -- 全局计数器 declare cnter int default 1; -- 局部计数器 declare lcnter int default 1; declare rand_title varchar(255); declare rand_content varchar(255); declare rand_status int; -- 模拟个图片 declare fixdImg varchar(255) default 'https://img2.woyaogexing.com/2022/05/11/13a96b447bb44741bf1231472c41fd43!400x400.jpeg'; set @pre_sql := "insert into t_bigdata(`title`, `content`, `status`, `img_url`) values"; set @t_sql := ""; SET autocommit=0; while cnter <= n do set lcnter = 1; set @t_sql := ""; while lcnter<=m and cnter<=n do set rand_title = concat('标题-',substr(replace(uuid(),'-',''), 1, 10)); set rand_content = uuid(); set rand_status = floor(rand()*6); if lcnter > 1 then set @t_sql := concat(@t_sql, ','); end if; set @t_sql := concat(@t_sql, "('", rand_title, "',", "'", rand_content, "',", rand_status, ",'", fixdImg, "'", ')'); set cnter = cnter+1; set lcnter = lcnter+1; end while; set @t_sql := concat(@pre_sql, @t_sql); -- 这里不用全局变量还执行不了。。。 prepare stmt from @t_sql; execute stmt; deallocate prepare stmt; end while; SET autocommit=1; end $$ delimiter ;
调用:
-- 参数1为生成数据条数,参数2为values拼接多少行 call batchInsertVals(1000000, 50);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~