mysql快速添加百万条记录的语句

本文介绍了一个具体的SQL数据操作案例,展示了如何使用INSERT INTO与SELECT语句相结合来实现数据的复制与迁移。这种技术在数据库维护和数据同步场景中非常实用。
INSERT INTO ler_items( classid, title, address, zipcode )
SELECT classid, title, address, zipcode
FROM ler_items 
<think>我们有一个需求:在MySQL中创建一个存储过程,向插入100记录。 根据引用[1]和引用[2]中的示例,我们可以创建一个存储过程,使用循环插入100数据。 步骤: 1. 创建目标(如果已有则跳过) 2. 创建存储过程,使用循环插入100记录 3. 调用存储过程 4. 删除存储过程(可选) 注意:在存储过程中,我们通常使用WHILE循环或REPEAT循环。这里我们使用WHILE循环。 假设我们有一个`t_user`,结构如下(参考引用[3]): ```sql CREATE TABLE `t_user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_name` varchar(30) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ``` 现在,我们创建一个存储过程,插入100记录,其中`user_name`为随机字符串(我们可以利用之前定义的随机字符串函数,但这里为了简单,我们使用连接一个随机数的方式,因为存储过程中可能没有那个函数。如果之前已经创建了随机字符串函数,也可以使用)。 但是,用户没有要求随机字符串,只是插入100记录。我们可以插入简单的数据,例如:user_name设置为'user'加上一个序号。 存储过程代码: ```sql DELIMITER $$ -- 如果存储过程已存在,则删除 DROP PROCEDURE IF EXISTS insert_100_users; CREATE PROCEDURE insert_100_users() BEGIN DECLARE i INT DEFAULT 1; WHILE i <= 100 DO INSERT INTO t_user (user_name) VALUES (CONCAT('user', i)); SET i = i + 1; END WHILE; END$$ DELIMITER ; ``` 然后调用存储过程: ```sql CALL insert_100_users(); ``` 如果希望使用随机字符串作为用户名,且之前已经创建了生成随机字符串的函数`generate_random_string`,则可以这样写: ```sql DELIMITER $$ DROP PROCEDURE IF EXISTS insert_100_random_users; CREATE PROCEDURE insert_100_random_users() BEGIN DECLARE i INT DEFAULT 1; WHILE i <= 100 DO INSERT INTO t_user (user_name) VALUES (generate_random_string(8)); -- 假设函数存在,生成长度为8的随机字符串 SET i = i + 1; END WHILE; END$$ DELIMITER ; CALL insert_100_random_users(); ``` 但注意:如果之前没有创建过`generate_random_string`函数,则不能使用。为了自包含,我们可以不使用随机字符串函数,而是用MySQL内置函数生成随机字符串的替代方法(如使用RAND()和字符串函数)来生成一个随机字符串,但这样会复杂一些。根据用户需求,只需要插入100记录,我们可以选择简单的方式。 考虑到用户可能没有创建随机字符串函数,我们采用第一种方式:使用固定前缀加序号。 完整步骤: 1. 创建(如果不存在) 2. 创建存储过程 3. 调用存储过程 示例: ```sql -- 创建 CREATE TABLE IF NOT EXISTS `t_user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_name` varchar(30) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 修改分隔符 DELIMITER $$ -- 删除已存在的存储过程 DROP PROCEDURE IF EXISTS insert_100_users; -- 创建存储过程 CREATE PROCEDURE insert_100_users() BEGIN DECLARE i INT DEFAULT 1; WHILE i <= 100 DO INSERT INTO t_user (user_name) VALUES (CONCAT('user', i)); SET i = i + 1; END WHILE; END$$ -- 恢复分隔符 DELIMITER ; -- 调用存储过程 CALL insert_100_users(); ``` 注意:在存储过程中,我们使用了`DELIMITER $$`来改变语句结束符,这样在定义存储过程时,可以将整个存储过程作为一个完整的语句传递给服务器。 如果需要插入更复杂的数据,可以参考引用[1]中的例子,使用RAND()函数生成随机数。 另外,如果插入过程中出现主键冲突,因为id是自增的,所以不会冲突。 执行完毕后,我们可以查询: ```sql SELECT * FROM t_user LIMIT 10; ``` 将显示前10记录。 最后,如果不再需要存储过程,可以删除: ```sql DROP PROCEDURE insert_100_users; ``` 但是,通常我们会保留存储过程以便再次使用。 根据引用[2],在插入大量数据(如100万)时,需要考虑事务和性能,但100数据量很小,无需特别处理。 因此,我们提供上述解决方案。</think>### MySQL 创建存储过程插入100记录的完整指南 #### 步骤1:创建数据 ```sql CREATE TABLE IF NOT EXISTS t_user ( id INT NOT NULL AUTO_INCREMENT, user_name VARCHAR(30) DEFAULT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ``` #### 步骤2:创建存储过程 ```sql DELIMITER $$ DROP PROCEDURE IF EXISTS insert_100_users; CREATE PROCEDURE insert_100_users() BEGIN DECLARE i INT DEFAULT 1; -- 初始化计数器 WHILE i <= 100 DO -- 循环100次 -- 插入带序号的数据(user1, user2...) INSERT INTO t_user (user_name) VALUES (CONCAT('user', i)); SET i = i + 1; -- 计数器递增 END WHILE; END$$ DELIMITER ; ``` #### 步骤3:执行存储过程 ```sql CALL insert_100_users(); -- 执行插入操作 ``` #### 步骤4:验证结果 ```sql SELECT COUNT(*) AS total_records FROM t_user; -- 应返回100 SELECT * FROM t_user LIMIT 5; -- 查看示例数据 ``` #### 增强版:插入随机数据 ```sql DELIMITER $$ DROP PROCEDURE IF EXISTS insert_random_users; CREATE PROCEDURE insert_random_users() BEGIN DECLARE i INT DEFAULT 1; DECLARE charset VARCHAR(26) DEFAULT 'abcdefghijklmnopqrstuvwxyz'; WHILE i <= 100 DO INSERT INTO t_user (user_name) VALUES ( CONCAT( SUBSTRING(charset, FLOOR(1 + RAND() * 26), 1), -- 随机首字母 SUBSTRING(charset, FLOOR(1 + RAND() * 26), 4) -- 随机4位字符 ) ); SET i = i + 1; END WHILE; END$$ DELIMITER ; -- 执行:CALL insert_random_users(); ``` #### 存储过程关键元素解析 | 组件 | 功能说明 | 示例 | |------|----------|------| | `DELIMITER $$` | 修改语句结束符 | 避免与过程中的`;`冲突 | | `DECLARE` | 声明变量 | `DECLARE i INT DEFAULT 1;` | | `WHILE` | 循环控制 | `WHILE i <= 100 DO ... END WHILE;` | | `CONCAT()` | 字符串拼接 | `CONCAT('user', i)` | | `RAND()` | 生成随机数 | `FLOOR(1 + RAND() * 26)` | #### 性能优化建议 1. **批量提交**(10万+数据): ```sql START TRANSACTION; CALL insert_100_users(); COMMIT; ``` 2. **禁用索引**(超大数据量): ```sql ALTER TABLE t_user DISABLE KEYS; CALL insert_100_users(); ALTER TABLE t_user ENABLE KEYS; ``` 3. **使用内存**: ```sql CREATE TABLE tmp_user (...) ENGINE=MEMORY; ``` #### 常见问题解决 **1. 权限不足错误:** ```sql GRANT CREATE ROUTINE ON *.* TO 'user'@'localhost'; ``` **2. 循环不执行:** 检查计数器初始值和件判断,确保满足`i <= 100` **3. 数据重复问题:** ```sql INSERT IGNORE INTO t_user ... -- 跳过重复记录 ``` **4. 查看存储过程:** ```sql SHOW CREATE PROCEDURE insert_100_users; -- 查看定义 SHOW PROCEDURE STATUS; -- 列出所有存储过程 ``` #### 应用场景示例 ```sql -- 创建测试数据 CALL insert_100_users(); -- 批量生成API密钥 UPDATE services SET api_key = CONCAT('key_', FLOOR(RAND()*1000000)) WHERE api_key IS NULL; -- 生成优惠码 INSERT INTO promo_codes(code) SELECT CONCAT('PROMO', FLOOR(1000 + RAND()*9000)) FROM information_schema.tables LIMIT 100; ``` ### 相关问题 1. 如何优化MySQL存储过程处理百万级数据插入?[^2] 2. 存储过程与应用程序插入数据的性能对比有何差异? 3. 如何在存储过程中实现事务回滚机制? 4. MySQL 8.0中存储过程有哪些新特性? 5. 如何避免存储过程中的主键冲突问题? 6. 存储过程与触发器的适用场景有何区别? 7. 如何导出和迁移MySQL存储过程到其他数据库? > 参考实现:MySQL存储过程语法[^1],循环控制结构[^2],字符串处理函数[^3]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值