MySQL中INSERT INTO SELECT如何为每行添加不同外部值
MySQL实现INSERT INTO SELECT时为每行生成递增自定义值的方案
针对你的需求,有两种适配不同MySQL版本的解决方案,均无需切换到INSERT INTO VALUES语法:
方案一:MySQL 8.0及以上版本(使用窗口函数)
利用MySQL 8.0引入的ROW_NUMBER()窗口函数,可直接为查询结果的每行分配递增序号,再拼接目标字符串即可:
INSERT INTO t1 (COL_1, COL_2, COL_3) SELECT COL_1, CONCAT('ext val ', ROW_NUMBER() OVER (ORDER BY COL_1)) AS COL_2, COL_3 FROM t2 WHERE COL_4 IN ('1', '2', '3', '4');
说明:ORDER BY COL_1用于指定序号的生成依据,保证每次执行时序号的稳定性,可根据实际需求替换为其他字段(如COL_4、创建时间等)。
方案二:MySQL 5.x版本(使用用户变量)
对于不支持窗口函数的低版本MySQL,可通过用户变量实现序号递增:
方式1:先初始化变量再执行插入
SET @row_num = 0; INSERT INTO t1 (COL_1, COL_2, COL_3) SELECT COL_1, CONCAT('ext val ', (@row_num := @row_num + 1)) AS COL_2, COL_3 FROM t2 WHERE COL_4 IN ('1', '2', '3', '4') ORDER BY COL_1;
方式2:单语句完成(无需单独初始化变量)
通过子查询初始化变量,将逻辑整合到一条语句中:
INSERT INTO t1 (COL_1, COL_2, COL_3) SELECT COL_1, CONCAT('ext val ', (@row_num := @row_num + 1)) AS COL_2, COL_3 FROM t2, (SELECT @row_num := 0) AS init_var WHERE COL_4 IN ('1', '2', '3', '4') ORDER BY COL_1;
说明:同样建议添加ORDER BY子句,避免因数据读取顺序变化导致序号混乱。
内容的提问来源于stack exchange,提问作者Otto
相关产品推荐
相关产品推荐

