如何批量向MySQL的curtain_entry_item表插入600条价格数据?
批量插入窗帘价格表数据到MySQL的高效方案
手动逐行插入600条数据确实太浪费时间了,这里给你两种实用的批量插入方案,根据你的MySQL版本选择就行:
方法一:MySQL 8.0+ 用递归CTE生成组合(推荐)
如果你的MySQL版本是8.0及以上,递归公共表表达式(CTE)是最简洁高效的方式,直接生成所有width和length的组合,一次性插入:
-- 开启事务提升插入性能(可选但推荐) START TRANSACTION; INSERT INTO curtain_entry_item (`group`, width, length, price) WITH RECURSIVE width_seq AS ( -- 起始width为20cm SELECT 20 AS width_val UNION ALL -- 每次加10,直到240cm SELECT width_val + 10 FROM width_seq WHERE width_val < 240 ), length_seq AS ( -- 起始length为20cm SELECT 20 AS length_val UNION ALL -- 每次加10,直到300cm SELECT length_val + 10 FROM length_seq WHERE length_val < 300 ) -- 交叉连接得到所有宽长组合,关联固定价格表31,价格固定为30 SELECT 31 AS `group`, CONCAT(width_val, 'cm') AS width, CONCAT(length_val, 'cm') AS length, 30 AS price FROM width_seq w CROSS JOIN length_seq l; COMMIT;
说明:
group是MySQL的保留关键字,所以必须用反引号``包裹,不然会报语法错误。- 如果你的
width和length字段是数值类型(比如存20而不是20cm),直接去掉CONCAT,用width_val和length_val即可。 - 如果价格不是固定值,比如和宽长有关,可以直接修改
SELECT里的price部分,比如(width_val * length_val) / 100这类表达式,根据你的定价规则调整。
方法二:MySQL 5.x 用存储过程循环插入
如果你的MySQL版本低于8.0,不支持CTE,那可以写一个存储过程来循环生成所有组合并插入:
-- 定义存储过程 DELIMITER // CREATE PROCEDURE InsertCurtainPriceData() BEGIN DECLARE curr_width INT DEFAULT 20; DECLARE curr_length INT DEFAULT 20; -- 开启事务 START TRANSACTION; -- 循环所有width值 WHILE curr_width <= 240 DO SET curr_length = 20; -- 循环当前width对应的所有length值 WHILE curr_length <= 300 DO INSERT INTO curtain_entry_item (`group`, width, length, price) VALUES (31, CONCAT(curr_width, 'cm'), CONCAT(curr_length, 'cm'), 30); SET curr_length = curr_length + 10; END WHILE; SET curr_width = curr_width + 10; END WHILE; COMMIT; END // DELIMITER ; -- 调用存储过程执行插入 CALL InsertCurtainPriceData();
后续操作:
执行完插入后,如果你不需要这个存储过程了,可以删掉它:
DROP PROCEDURE IF EXISTS InsertCurtainPriceData;
额外提示
- 插入前可以先备份表,或者测试插入少量数据验证逻辑是否正确,避免出错后返工。
- 如果表中有唯一约束或者索引,批量插入前可以暂时禁用索引,插入完成后再开启,能大幅提升插入速度。
内容的提问来源于stack exchange,提问作者Wouter Van Domselaar
相关产品推荐
相关产品推荐

