MySQL Workbench批量INSERT与重复SELECT问题:按数量生成多条记录
嘿,这个需求我之前做项目时刚好遇到过,不管是重复插入还是查询返回重复记录,都有简洁的解决办法,咱们分场景说:
一、基于quantity重复插入记录(INSERT场景)
方法1:MySQL 8.0+ 用递归CTE(推荐)
如果你的MySQL版本是8.0及以上,递归CTE是最灵活的方式,不用额外建表。比如你要插入的单条记录是(1, '2024-05-20', 5),quantity为5,代码如下:
-- 假设目标表是orders,结构为(id INT, order_date DATE, quantity INT) WITH RECURSIVE nums AS ( SELECT 1 AS n UNION ALL SELECT n + 1 FROM nums WHERE n < 5 -- 这里的5替换成你的quantity值,也可以用子查询动态获取 ) INSERT INTO orders (id, order_date, quantity) SELECT 1, '2024-05-20', 5 FROM nums;
如果quantity是来自某个字段(比如从另一个表获取),可以把5换成子查询,比如(SELECT quantity FROM source_table WHERE id=1)。
方法2:低版本MySQL(5.x)用临时数字表
如果你的MySQL不支持CTE,那就先建个临时数字表,插入对应数量的行,再关联插入:
-- 创建临时数字表,插入1到5的数字(数量和quantity一致) CREATE TEMPORARY TABLE nums (n INT); INSERT INTO nums VALUES (1),(2),(3),(4),(5); -- 执行插入 INSERT INTO orders (id, order_date, quantity) SELECT 1, '2024-05-20', 5 FROM nums;
用完临时表可以删掉:DROP TEMPORARY TABLE nums;
方法3:用系统表做笛卡尔积(应急方案)
不想建表的话,可以利用MySQL自带的系统表(比如information_schema.tables)生成足够的行,用LIMIT控制数量:
INSERT INTO orders (id, order_date, quantity) SELECT 1, '2024-05-20', 5 FROM information_schema.tables t1 CROSS JOIN information_schema.tables t2 -- 交叉连接生成足够多的行 LIMIT 5; -- 这里的LIMIT值就是quantity
注意:系统表的行数要大于等于你的quantity,否则会不够。
二、基于quantity返回重复记录(SELECT场景)
这个场景和插入逻辑类似,核心是生成一个和quantity数量匹配的数字序列,然后和原查询结果做交叉连接。
方法1:MySQL 8.0+ 递归CTE动态匹配quantity
如果你的quantity是目标记录的字段值,比如要查询id=1的记录,它的quantity是5,返回5条相同记录:
WITH RECURSIVE nums AS ( SELECT 1 AS n UNION ALL SELECT n + 1 FROM nums WHERE n < (SELECT quantity FROM orders WHERE id=1) ) SELECT o.id, o.order_date FROM orders o CROSS JOIN nums WHERE o.id=1;
方法2:低版本MySQL用数字表关联
同样用之前的临时数字表,关联时过滤数字不超过quantity:
SELECT o.id, o.order_date FROM orders o CROSS JOIN nums WHERE o.id=1 AND nums.n <= o.quantity;
这样处理后,不管是插入还是查询,都能精准控制重复的次数啦~
内容的提问来源于stack exchange,提问作者Geoff_S
相关产品推荐
相关产品推荐

