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;
相关推荐
jiayou641 天前
KingbaseES 表级与列级加密完全指南
数据库·后端
GBASE2 天前
G术时刻 |GBase 8s数据库事务并发控制之封锁技术介绍(下)
数据库
xiezhr2 天前
逛GitHub发现了一款免费的带AI功能的数据库管理工具
数据库·ai编程·dba
吃糖的小孩3 天前
给 QQ AI 机器人设计“可控记忆”:会话摘要、手动长期记忆与角色卡边界
数据库
笃行3504 天前
金仓数据库数据安全双防线:静态存储加密与传输加密实战
数据库
笃行3504 天前
金仓数据库物理备份实战:sys_rman 全流程演练与误覆盖抢救
数据库
笃行3504 天前
金仓数据库逻辑备份实战:从全库导出到 Schema 替换的完整闭环
数据库
SelectDB5 天前
阶跃星辰基于 SelectDB 构建 PB 级 Agent 可观测平台
大数据·数据库·aigc
这个DBA有点耶5 天前
GROUP BY优化全解:如何写出既不丢数据又飞快的分组查询
数据库·mysql·架构