Oracle 21c中使用Sequence优化批量Insert语句的方法
Oracle 21c 批量插入多行数据并自动生成序列主键
方案1:使用多行VALUES子句(Oracle 12c+支持)
直接在INSERT语句中编写多个VALUES组,序列的NEXTVAL会为每一行生成独立的主键值,无需重复编写INSERT和SELECT FROM dual。
INSERT INTO clinica_medica_t_convenios (id_cod_convenio, columna2, columna3, ...) VALUES (s_cod_convenios.NEXTVAL, 'valor2_1', 'valor3_1', ...), (s_cod_convenios.NEXTVAL, 'valor2_2', 'valor3_2', ...), (s_cod_convenios.NEXTVAL, 'valor2_3', 'valor3_3', ...);
这种写法简洁直观,每个VALUES组对应一行数据,序列每次调用NEXTVAL都会生成新的主键,确保每行的id_cod_convenio唯一。
方案2:使用INSERT ... SELECT ... UNION ALL 语法
如果需要兼容更早版本的Oracle,或需对插入数据做预处理,可通过子查询拼接多行数据后批量插入。
INSERT INTO clinica_medica_t_convenios (id_cod_convenio, columna2, columna3, ...) SELECT s_cod_convenios.NEXTVAL, t.columna2, t.columna3, ... FROM ( SELECT 'valor2_1' AS columna2, 'valor3_1' AS columna3, ... FROM DUAL UNION ALL SELECT 'valor2_2' AS columna2, 'valor3_2' AS columna3, ... FROM DUAL UNION ALL SELECT 'valor2_3' AS columna2, 'valor3_3' AS columna3, ... FROM DUAL ) t;
子查询负责生成多行原始数据,外层SELECT调用序列NEXTVAL,确保每行获取唯一主键值,适合需要对数据做计算、转换的场景。
注意事项
- 确保序列
s_cod_convenios的增量和当前值符合业务需求,避免主键冲突。 - 不要使用
INSERT ALL语法处理序列主键场景:Oracle处理INSERT ALL时只会执行一次序列递增,导致所有行共用同一个主键值,不符合需求。
内容的提问来源于stack exchange,提问作者Fred K
相关产品推荐
相关产品推荐

