Oracle中实现一次插入多条数据

一、需求描述

在我们实际的业务场景中,由于单条插入的效率很低(每次都需要数据库资源连接关闭的开销),故需要实现一次性插入多条数据,用以提升数据插入的效率;

如下图是常见的单条插入数据:

二、Oracle实现一次插入多条数据

我这里以grade2表为例进行演示说明:

2.1、union all拼接查询

采用union all拼接查询方式实现一次向同一个表中插入多条数据语法:

sql 复制代码
INSERT into 表名(字段名1,字段名2,字段名3,...) 
SELECT 值1,值2,值3,... from dual
union all SELECT 值11,值21,值31,... from dual
union all SELECT 值12,值22,值32,... from dual
...

示例(向同一个表同时插入6条不同内容的数据):

sql 复制代码
INSERT into "grade2"("name","chinese","math","english") 
SELECT '张10',100,100,100 from dual
union all SELECT '张20',101,101,101 from dual
union all SELECT '张30',102,102,102 from dual
union all SELECT '张40',103,103,103 from dual
union all SELECT '张50',104,104,104 from dual
union all SELECT '张60',105,105,105 from dual

2.2、insert all插入

采用insert all方式实现一次向同一个表中插入多条数据语法:

sql 复制代码
insert all 
into 表名(字段名1,字段名2,字段名3,...) VALUES(值1,值2,值3,...)
into 表名(字段名1,字段名2,字段名3,...) VALUES(值11,值21,值31,...)
into 表名(字段名1,字段名2,字段名3,...) VALUES(值12,值22,值32,...)
...
SELECT * from dual;

示例(向同一个表同时插入6条不同内容的数据):

sql 复制代码
insert all 
into "grade2"("name","chinese","math","english") VALUES('张11',100,100,100)
into "grade2"("name","chinese","math","english") VALUES('张21',101,101,101)
into "grade2"("name","chinese","math","english") VALUES('张31',102,102,102)
into "grade2"("name","chinese","math","english") VALUES('张41',103,103,103)
into "grade2"("name","chinese","math","english") VALUES('张51',104,104,104)
into "grade2"("name","chinese","math","english") VALUES('张61',105,105,105)
SELECT * from dual;

insert all方式实现一次向多个表中插入多条数据语法:

sql 复制代码
insert all 
into 表名1(字段名1,字段名2,字段名3,...) VALUES(值1,值2,值3,...)
into 表名1(字段名1,字段名2,字段名3,...) VALUES(值11,值21,值31,...)
into 表名1(字段名1,字段名2,字段名3,...) VALUES(值12,值22,值32,...)
into 表名2(字段名1,字段名2,字段名3,...) VALUES(值1,值2,值3,...)
into 表名2(字段名1,字段名2,字段名3,...) VALUES(值11,值21,值31,...)
into 表名2(字段名1,字段名2,字段名3,...) VALUES(值12,值22,值32,...)
into 表名3(字段名1,字段名2,字段名3,...) VALUES(值1,值2,值3,...)
into 表名3(字段名1,字段名2,字段名3,...) VALUES(值11,值21,值31,...)
into 表名3(字段名1,字段名2,字段名3,...) VALUES(值12,值22,值32,...)
...
SELECT * from dual;

示例(向多个表同时插入6条不同内容的数据):

sql 复制代码
insert all 
into "grade2"("name","chinese","math","english") VALUES('张11',100,100,100)
into "grade2"("name","chinese","math","english") VALUES('张21',101,101,101)
into "grade2"("name","chinese","math","english") VALUES('张31',102,102,102)
into "grade"("id","name","course","score","sex","age") VALUES(11,'张11','语文',100,'男',26)
into "grade"("id","name","course","score","sex","age") VALUES(12,'张21','数学',100,'男',26)
into "grade"("id","name","course","score","sex","age") VALUES(13,'张31','英语',100,'男',26)
SELECT * from dual;

注意:insert all语句里不能直接使用序列生成的值(因为即便每个into语句里都加上seq_test_insert.nextval也不会获得多个值):

sql 复制代码
-- 创建序列
create sequence seq_test_insert 
minvalue 1
maxvalue 999999999999999999999999
start with 1
increment by 1
cache 20;

-- 获取下一个序列值
SELECT seq_test_insert.nextval from dual;
相关推荐
m0_639906944 小时前
MySQL 锁机制详解|表锁、行锁、意向锁,死锁成因与解决方案
数据库·mysql
进击的荆棘4 小时前
MySQL——在ubuntu环境下安装MySQL
数据库·mysql·ubuntu
hey you~4 小时前
云呼叫中心坐席自动分配实战:ACD 策略、Redis+Lua 实现与排查清单
数据库·redis·lua·云呼叫中心·acd·坐席分配·坐席状态机
夜雪一千4 小时前
MySQL 数据字典如何获得
数据库·mysql
系统集成-鹰翔4 小时前
ERP推单数据库怎么备份:SQLite WAL模式下只复制db文件为什么可能漏任务
javascript·数据库·经验分享·后端
QianhangQianping4 小时前
撤销重做不是「存快照」:一个可视化编辑器的Operation 设计
java·前端·数据库·typescript·编辑器·前端架构·撤销重做
honsor5 小时前
用 Grafana 做温湿度异常检测:从阈值告警到趋势预测
数据库·mysql·php
赵渝强老师5 小时前
【赵渝强老师】YashanDB Developer Center(YDC,崖山数据库开发者中心)
数据库·国产数据库·yashandb·崖山数据库
lusklusklusk5 小时前
SQL Server 为什么普通 SELECT 会阻塞 UPDATE?——行级 S 锁到表级 S 锁的锁升级原理与实验验证
数据库·mysql·oracle
Leo.yuan5 小时前
企业业务人员如何独立完成数据分析?2026年自助BI工具选型与应用指南
大数据·数据库·人工智能