SQL如何遍历整数列表批量插入仅单值不同的多行记录
方案1:单条INSERT批量插入(所有主流数据库通用)
这是门槛最低的实现方式,无需创建额外对象,直接把可变值拼接到VALUES列表后即可,语法如下:
INSERT INTO tblTableName (columnName1, columnName2, columnName3, columnName4) VALUES (sameData1, sameData2, sameData3, 907), (sameData1, sameData2, sameData3, 908), (sameData1, sameData2, sameData3, 875), -- 按该格式追加所有可变整数对应的行即可 (sameData1, sameData2, sameData3, 885);
该方案的优势:
- 语法完全通用,支持MySQL、PostgreSQL、SQL Server、SQLite等所有主流关系型数据库
- 无需创建临时表、数组等额外对象,执行一次即可完成所有行插入
- 绝大多数数据库支持单次插入数千行,只要可变值数量不过万都可以直接使用
方案2:数组映射插入(适合可变值数量极多的场景,按数据库类型选择实现)
如果可变值数量过万,或者不想重复写固定值部分,可以用对应数据库的数组解析功能实现,仅需输入一次固定值:
MySQL 实现
INSERT INTO tblTableName (columnName1, columnName2, columnName3, columnName4) SELECT 'sameData1', -- 替换为你实际的固定值 'sameData2', 'sameData3', variable_value FROM JSON_TABLE( '[907, 908, 875, 876, 878, 885]', -- 直接把所有可变整数放到这个数组中 '$[*]' COLUMNS (variable_value INT PATH '$') ) AS tmp;
PostgreSQL 实现
INSERT INTO tblTableName (columnName1, columnName2, columnName3, columnName4) SELECT 'sameData1', -- 替换为实际固定值 'sameData2', 'sameData3', unnest(ARRAY[907, 908, 875, 876, 878, 885]); -- 把可变值放到这个数组中即可
SQL Server 实现
INSERT INTO tblTableName (columnName1, columnName2, columnName3, columnName4) SELECT 'sameData1', -- 替换为实际固定值 'sameData2', 'sameData3', CAST(value AS INT) FROM STRING_SPLIT('907,908,875,876,878,885', ','); -- 直接把所有可变值用逗号拼接放在引号中
额外提示
如果你的可变值是连续整数,还可以用递归CTE自动生成序列,不用手动输入所有值,通用示例如下:
WITH RECURSIVE num_seq AS ( SELECT 900 AS n -- 序列起始值 UNION ALL SELECT n + 1 FROM num_seq WHERE n < 1000 -- 序列结束值,这里会生成900-1000的所有整数 ) INSERT INTO tblTableName (columnName1, columnName2, columnName3, columnName4) SELECT 'sameData1', 'sameData2', 'sameData3', n FROM num_seq;
如果遇到单条INSERT长度限制,拆分为2-3条批量INSERT即可,效率远高于单次插入一行。
内容的提问来源于stack exchange,提问作者AnthonyGFS
相关产品推荐
相关产品推荐

