MySQL:基于Quantity列值生成行并插入ProductionActual表
MySQL实现按Quantity生成多行数据插入表的方案
针对你的需求,这里提供两种适配MySQL的实现方案,分别对应不同版本的MySQL:
方案一:MySQL 8.0+ 使用递归CTE
MySQL 8.0及以上版本支持递归公共表表达式(CTE),可以直接生成序列来匹配Quantity的行数:
WITH RECURSIVE num_series AS ( SELECT 1 AS series UNION ALL SELECT series + 1 FROM num_series WHERE series < (SELECT MAX(Quantity) FROM Producttemp) ) INSERT INTO ProductionActual (Requisition, Quantity, Series) SELECT pt.Requisition, pt.Quantity, ns.series FROM Producttemp pt JOIN num_series ns ON ns.series <= pt.Quantity;
说明
- 递归CTE
num_series生成从1到Producttemp表中最大Quantity值的连续序列 - 通过JOIN关联Producttemp和序列表,只保留每个Requisition对应的序列值不超过其Quantity的行
- 直接将符合条件的数据插入到ProductionActual表
方案二:MySQL 5.x 版本(不支持递归CTE)
对于不支持递归CTE的旧版本MySQL,可以通过创建数字辅助表来实现:
步骤1:创建并填充数字辅助表
-- 创建数字辅助表,可复用 CREATE TABLE IF NOT EXISTS number_table (num INT PRIMARY KEY); -- 插入1到1000的连续数字(可根据实际最大Quantity调整范围) INSERT INTO number_table (num) SELECT a.N + b.N * 10 + c.N * 100 + 1 AS num FROM (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a, (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b, (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) c WHERE a.N + b.N * 10 + c.N * 100 + 1 <= 1000;
步骤2:执行插入操作
INSERT INTO ProductionActual (Requisition, Quantity, Series) SELECT pt.Requisition, pt.Quantity, nt.num AS Series FROM Producttemp pt JOIN number_table nt ON nt.num <= pt.Quantity;
说明
- 数字辅助表存储足够多的连续整数,确保覆盖Producttemp中所有可能的Quantity值
- 通过JOIN关联Producttemp和数字表,筛选出每个Requisition对应的有效序列行,插入目标表
测试示例
如果需要验证效果,可以先创建测试表并插入示例数据:
-- 创建Producttemp表 CREATE TABLE Producttemp ( Requisition VARCHAR(20), Quantity INT ); INSERT INTO Producttemp VALUES ('GJ002_01_AD',5),('GJ002_02_AD',3); -- 创建ProductionActual表 CREATE TABLE ProductionActual ( Requisition VARCHAR(20), Quantity INT, Series INT );
执行对应版本的插入语句后,查询ProductionActual表即可得到你期望的结果。
内容的提问来源于stack exchange,提问作者Thavisack VRCHDV
相关产品推荐
相关产品推荐

