oracle如何insert into 多个values

oracle如何insert into 多个values

稍微熟悉Oracle的都知道,如果我们想一条SQL语句向表中插入多个值的话,如果如下语句

INSERT INTO 某表 VALUES(各个值),VALUES(各个值),.....;

这样会报错的,因为oracle是不支持这种写法的,如果多个INSERT INTO VALUEES(各个值);这样以“;”隔开一同执行也是不行的,oracle也是不支持的。

       不过MySQL这两种方式都是支持的。在MySQL中还可以使用如下格式的插入语句:

 
示例:
insert into persons 
(id_p, lastname , firstName, city )
values
(200,'haha' , 'deng' , 'shenzhen'),
(201,'haha2' , 'deng' , 'GD'),
(202,'haha3' , 'deng' , 'Beijing');
 

这样就批量插入数据了

 

       SQL Server也是不支持这两种写法的。

       然而,有时我们在开发过程中,如果是用的oracle数据库的话,有时很需要这种“INSERT INTO  某表” 一次性能插入多个值这样的功能,但oracle又不支持以上两种方式那么我们怎么办?是的可能你很机灵的想到了几种方法,如存储过程,或着INSERT INTO 某表 SELECT * FROM 某个表等,不过声明一下,我们在此不探讨这些方法,而且都有一定的局限性,有时我就要插入指定的几个值,而且一条SQL语句完成,存储过程的话,万不得已,建议大家不要使用,当然这个根据情况而定,可以读读这个博客存储过程的优缺点,分析的很详细。

       那么有没有其他方法呢?答案是肯定有的,也许熟悉oracle数据库的可能知道从oracle9i版本以后,可以使用一种方法即:

"INSERT ALL INTO  a表
VALUES(各个值)  
INTO a表 VALUES (其它值) 
INTO a表 VALUES(其它值) ....再跟一个SELECT 语句"。

后边跟的SELECT 语句我们可以从虚拟表里查如 SELECT 1 FROM DUAL。注意后边跟的SELECT语句可以随意,不过不是把它SELECT出来的内容插入前边的表里,而是起到前边的多个数据每次插入多少行的作用,这个多少行是和后边跟的SELECT语句查出来几条而定的,如后边的跟的SELECT 语句查出了15条记录,那么前边的"INSERT ALL INTO  a表 VALUES(各个值1)  INTO a表 VALUES (其它值2) INTO a表 VALUES(其它值3)"就会先插入值1对应的各个字段插入15条记录,然后插入值2各个对应的字段15条记录,然后插入值3对应的各个字段15条记录,也就是说有点按列插入的意思。

       我们要的是批量插入多个VALUES这样的一条记录,所以后边的SELECT 语句只要能查出一条记录就行,建议大家后边用SELECT 1 FROM DUAL

       下边看一个例子,一目了然,一看就会用了:

 

        OK了,我们实现了没用存储过程用一条SQL语句完成了向oracle的表中插入多个指定的值。也许你会问这有啥用处,告诉你,如果你在一定情况下用到它,作用就大了,避免了写复杂而又没必要写的存储过程,避免了执行多个SQL语句多次连接数据库的开销,当你知道了学到了,遇到问题用的时候就会明白了,不过鄙人不才,对数据库了解不深,如果你觉得说的没有道理或者你有更好的点子或者方法,非常欢迎留言交流,以便您,我,还有大家,共同的学习与成长!

 

出处:http://blog.youkuaiyun.com/chenleixing/article/details/45165761/

=======================================================

对于以上方法本人亲测如下:

环境:

PL/SQL Developer Version 9.0.0.1601

Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

测试用表:jack_20170206_aa

 
insert all 
 into jack_20170206_aa values('4014033')
 into jack_20170206_aa values('4065304')
 into jack_20170206_aa values('4088136')
 into jack_20170206_aa values('4092405')
select 1 from dual;
 

因为我的表里只有一个字段,所以就没有写出字段名来。

如果插入的不是全部字段,也可以使用下面的形式:

insert into sc(sno,cno) values('95020','1')

 

### 如何在 Oracle 中通过单个 `INSERT INTO` 语句插入多行数据 在 Oracle 数据库中,可以通过多种方式实现单条 `INSERT INTO` 语句插入多行数据。以下是几种常见的方法: #### 方法一:使用 `UNION ALL` 可以利用子查询的方式结合 `UNION ALL` 来一次性插入多行数据。这种方式适用于需要显式指定每一行的数据的情况。 ```sql INSERT INTO emp_10 (empno, ename, job, mgr, sal, deptno) SELECT 1001, 'Alice', 'CLERK', NULL, 2500, 10 FROM dual UNION ALL SELECT 1002, 'Bob', 'MANAGER', 1001, 3000, 10 FROM dual UNION ALL SELECT 1003, 'Charlie', 'SALESMAN', 1002, 2800, 10 FROM dual; ``` 这种方法的核心在于将多个 `SELECT` 子句组合起来,并通过 `UNION ALL` 将它们的结果集合并成一个整体[^4]。 --- #### 方法二:使用 `INSERT ALL` 如果目标表结构相同或者可以映射,则可以直接使用 `INSERT ALL` 语法来完成多行插入操作。这是 Oracle 提供的一种高效写法。 ```sql INSERT ALL INTO emp_10 VALUES (1001, 'Alice', 'CLERK', NULL, 2500, 10) INTO emp_10 VALUES (1002, 'Bob', 'MANAGER', 1001, 3000, 10) INTO emp_10 VALUES (1003, 'Charlie', 'SALESMAN', 1002, 2800, 10) SELECT * FROM dual; ``` 此方法的特点是可以针对不同的目标表分别插入不同数据,也可以向同一个表多次插入数据[^1]。 --- #### 方法三:基于现有表的批量插入 当需要从其他表中复制大量数据时,可以采用 `INSERT ... SELECT` 的形式。这种做法特别适合于已有数据源的情况下快速填充新表。 假设我们希望从 `emp` 表中筛选特定条件下的记录并将其分配给新的分组表(如 `emp_10`, `emp_20` 和 `emp_30`),则可执行如下 SQL 脚本: ```sql -- 插入部门号为10的员工至emp_10表 INSERT INTO emp_10 (empno, ename, job, mgr, sal, deptno) SELECT empno, ename, job, mgr, sal, deptno FROM emp WHERE deptno = 10; -- 同理处理其它部门编号对应的表格... INSERT INTO emp_20 (empno, ename, job, mgr, sal, deptno) SELECT empno, ename, job, mgr, sal, deptno FROM emp WHERE deptno = 20; INSERT INTO emp_30 (empno, ename, job, mgr, sal, deptno) SELECT empno, ename, job, mgr, sal, deptno FROM emp WHERE deptno = 30; ``` 上述脚本展示了如何依据原始表的内容创建派生数据副本[^2]。 --- #### 总结 以上三种方案各有适用场景: - **`UNION ALL`** 更加灵活,尤其适合少量固定值的手动输入; - **`INSERT ALL`** 则提供了更简洁直观的形式用于同时更新多个目标对象或重复写入同一张表; - 对于大规模迁移任务来说,推荐优先考虑 **`INSERT...SELECT`** 结构因为它能够充分利用底层优化机制从而提升性能表现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值