Oracle中的insert/insert all/insert first

1、概念

Oracle 中insert all 是指把 同一批 数据插入到 不同的表 中。

假如,现在有个需求,把表 t 的中数据分别插入到 t1、t2,如果你不知道 insert all, 你可能会使用 insert 插入 2 次,例如:

INSERT INTO t1(object_id, object_name) SELECT * FROM t;

INSERT INTO t2(object_id, object_name) SELECT * FROM t;

COMMIT;

其实,以上这样的写法,不一定正确。在 两次 insert 过程中, 有可能 t 表的数据发生了改变,从而导致 t1、t2 表得到的数据不一样,正确的写法是用 insert all

INSERT ALL

INTO t1(object_id, object_name)

INTO t2(object_id, object_name)

SELECT * FROM t;

COMMIT;

1.1 思维导图

1.2 基础数据

DROP TABLE stu; -- if exists

CREATE TABLE stu (

s_id NUMBER,

s_xm VARCHAR2(30)

);

INSERT INTO stu(s_id, s_xm) VALUES (1, '小游子');

INSERT INTO stu(s_id, s_xm) VALUES (2, '小优子');

INSERT INTO stu(s_id, s_xm) VALUES (3, '小倩子');

COMMIT;

2、实例分析

2.1 无条件插入

CREATE TABLE stu1 AS SELECT * from stu WHERE 1 = 2;

CREATE TABLE stu2 AS SELECT * from stu WHERE 1 = 2;

INSERT ALL

INTO stu1(s_id, s_xm)

INTO stu2(s_id, s_xm)

SELECT * FROM stu;

COMMIT;

SELECT * FROM stu1;

SELECT * FROM stu2;

2.2 有条件插入

2.2.1 insert first

对于每一行数据,只插入到 第一个when 条件成立的表,不继续检查其他条件。

DROP TABLE stu1; -- if exists

DROP TABLE stu2; -- if exists

CREATE TABLE stu1 AS SELECT * FROM stu WHERE 1 = 2;

CREATE TABLE stu2 AS SELECT * FROM stu WHERE 1 = 2;

INSERT FIRST

WHEN s_id <= 2 THEN

INTO stu1 (s_id, s_xm)

WHEN s_id >= 2 THEN -- 注意 2 是重复的哦

INTO stu2 (s_id, s_xm)

SELECT * FROM stu;

SELECT * FROM stu1;

SELECT * FROM stu2;

测试结果:

2.2.2 insert all

对于每一行数据,对 每一个when 条件都进行检查,如果满足条件就执行插入操作。

-- 仅将上述 FIRST 改为 ALL

DROP TABLE stu1; -- if exists

DROP TABLE stu2; -- if exists

CREATE TABLE stu1 AS SELECT * FROM stu WHERE 1 = 2;

CREATE TABLE stu2 AS SELECT * FROM stu WHERE 1 = 2;

INSERT ALL

WHEN s_id <= 2 THEN

INTO stu1 (s_id, s_xm)

WHEN s_id >= 2 THEN -- 注意 2 是重复的哦

INTO stu2 (s_id, s_xm)

SELECT * FROM stu;

SELECT * FROM stu1;

SELECT * FROM stu2;

测试结果:

3、其他操作

3.1 行转列插入

DROP TABLE stu1; -- if exists

DROP TABLE stu2; -- if exists

CREATE TABLE stu1 (

s_id NUMBER,

s_xm VARCHAR(30) -- 数据类型要一致哦

);

CREATE TABLE stu2 (

s_id  NUMBER,

s_xm1 VARCHAR2(30),

s_xm2 VARCHAR2(30),

s_xm3 VARCHAR2(30)

);

INSERT INTO stu2(s_id, s_xm1, s_xm2, s_xm3) VALUES (1, 'a1', 'b1', 'c1');

INSERT INTO stu2(s_id, s_xm1, s_xm2, s_xm3) VALUES (2, 'a2', 'b2', 'c2');

INSERT INTO stu2(s_id, s_xm1, s_xm2, s_xm3) VALUES (3, 'a3', 'b3', 'c3');

INSERT ALL

INTO stu1 VALUES (s_id, s_xm1)

INTO stu1 VALUES (s_id, s_xm2)

INTO stu1 VALUES (s_id, s_xm3)

SELECT * FROM stu2;

SELECT * FROM stu1;

测试结果:

————————————————

insert all官方文档解释:

/*

多表插入语句的限制条件:

1. 只能对表执行多表插入语句,不能对视图或物化视图执行;

2. 不能对远端表执行多表插入语句;

3. 不能使用表集合表达式;

4. 不能超过999个目标列;

5. 在RAC环境中或目标表是索引组织表或目标表上建有BITMAP索引时,多表插入语句不能并行执行;

6. 多表插入语句不支持执行计划稳定性;

7. 多表插入语句中的子查询不能使用序列。

*/

第一步:准备数据

CREATE TABLE t1(product_id NUMBER, product_name VARCHAR2(80),MONTH NUMBER);

INSERT INTO t1 VALUES(111, '苹果',1);

INSERT INTO t1 VALUES(222, '橘子',1);

INSERT INTO t1 VALUES(333, '香蕉',1);

第二部:insert all

INSERT ALL

INTO t2

VALUES (product_id, product_name,MONTH)

INTO t2

VALUES (product_id, product_name,MONTH+1)

INTO t2

VALUES (product_id, product_name,MONTH+2)

INTO t2

VALUES (product_id, product_name,MONTH+3)

SELECT product_id, product_name, MONTH

FROM t1;

这里的表t2的数据下面会用到

---------------------------------------------------------------------------

第三步:有条件的insert all

insert all

when month=1 then

into t3

when month=2 then

into t4

else

into t5

select product_id,product_name,month from t2;

commit;

-------------------------------------------------------------------------

第四部:insert first (需要讲解下)

insert first

when month=1 then

into t3 VALUES(product_id,product_name,month)

when product_id=111 then

into t4 VALUES(product_id,product_name,month)

else

into t5 VALUES(product_id,product_name,month)

select product_id,product_name,month from t2;

commit;

--------------------------------------------------------------------------

根据第二部,t2表的数据做测试。

查询t4表发现:少了一条 111 苹果 1

111 苹果2

111 苹果 3

111 苹果 4

总结:insert first 当数据满足第一when 条件的时候,不会作用在下面的when条件了,

简而言之:当一条数据满足条件后,即使满足后面的条件也不会插入数据库。

正常情况:如果数据满足所有的when条件,每个表都会插入该条数据,insert first 数据只会插入一个表。

无条件的插入

Oracle中的insert all是指把同一批数据插入到不同的表中,假如如今有个需求:把t表中的数据分别插入t1,t2,假设你不知道insert all,你可能会使用insert插入2次,例如以下所看到的:

insert  into t1(object_name,object_id) select * from t;
insert  into t2(object_name,object_id) select * from t;
commit;

其实,以上这样的写法是错误的,由于在两次insert的过程中,t表的数据有可能已经发生了变化,也就是说,t1,t2表得到的数据有可能不一样,正确的写法应该是採用insert all:

insert all
into t1(object_name,object_id)
into t2(object_name,object_id)
select * from t;
commit;

有条件的插入

insert first/all 是对每一行来进行推断
两者差别:
insert first:对于每一行数据,仅仅插入到第一个when条件成立的表,不继续检查其它条件。
insert all : 对于每一行数据,对每个when条件都进行检查,假设满足条件就运行插入操作。 

看以下的样例:

--insert first
--前面等于1的条件被<=5含在内,FIRST就表示前面插入了,后面不会再插入了。
insert first
when object_id = 1 then
into t1(object_name,object_id)
when object_id <=5 then
into t2(object_name,object_id)
select * from t;
commit;
select * from t1;
OBJECT_NAME                OBJECT_ID
--------------------------------- ---
ICOL$                              1
select * from t2;
OBJECT_NAME                OBJECT_ID
--------------------------------- ---
I_USER1                            2
CON$                               3
UNDO$                              4
C_COBJ#                            5
--insert all
insert all
when object_id = 1 then
into t1(object_name,object_id)
when object_id <=5 then
into t2(object_name,object_id)
select * from t;
commit;
SQL> select * from t1;
OBJECT_NAME                OBJECT_ID
--------------------------------- ---
ICOL$                              1
SQL> select * from t2;
OBJECT_NAME                OBJECT_ID
--------------------------------- ---
ICOL$                              1
I_USER1                            2
CON$                               3
UNDO$                              4
C_COBJ#                            5

行转列插入

insert all还能够实现行转列插入:
select * from sales_source_data;
EMPLOYEE_ID    WEEK_ID  SALES_MON  SALES_TUE  SALES_WED SALES_THUR  SALES_FRI
----------- ---------- ---------- ---------- ---------- ---------- ----------176          6       2000       3000       4000       5000       6000
insert all
into sales_info values(employee_id,week_id,sales_mon)
into sales_info values(employee_id,week_id,sales_tue)
into sales_info values(employee_id,week_id,sales_wed)
into sales_info values(employee_id,week_id,sales_thur)
into sales_info values(employee_id,week_id,sales_fri)
select employee_id,week_id,sales_mon,sales_tue,
sales_wed,sales_thur,sales_fri
from sales_source_data;
select * from sales_info;
EMPLOYEE_ID       WEEK      SALES
----------- ---------- ----------176          6       2000176          6       3000176          6       4000176          6       5000176          6       6000

多表插入语句的限制条件

1. 仅仅能对表运行多表插入语句,不能对视图或物化视图运行;
 2. 不能对远端表运行多表插入语句;
 3. 不能使用表集合表达式;
 4. 不能超过999个目标列;
 5. 在RAC环境中或目标表是索引组织表或目标表上建有BITMAP索引时,多表插入语句不能并行运行;
 6. 多表插入语句不支持运行计划稳定性;
 7. 多表插入语句中的子查询不能使用序列。



About Me

........................................................................................................................

● 本文作者:小麦苗,部分内容整理自网络,若有侵权请联系小麦苗删除

● 本文在itpub、博客园、CSDN和个人微 信公众号( xiaomaimiaolhr)上有同步更新

● 本文itpub地址: http://blog.itpub.net/26736162

● 本文博客园地址: http://www.cnblogs.com/lhrbest

● 本文CSDN地址: https://blog.csdn.net/lihuarongaini

● 本文pdf版、个人简介及小麦苗云盘地址: http://blog.itpub.net/26736162/viewspace-1624453/

● 数据库笔试面试题库及解答: http://blog.itpub.net/26736162/viewspace-2134706/

● DBA宝典今日头条号地址: http://www.toutiao.com/c/user/6401772890/#mid=1564638659405826

........................................................................................................................

● QQ群号: 230161599 、618766405

● 微 信群:可加我微 信,我拉大家进群,非诚勿扰

● 联系我请加QQ好友 ( 646634621 ),注明添加缘由

● 于 2019-09-01 06:00 ~ 2019-09-31 24:00 在西安完成

● 最新修改时间:2019-09-01 06:00 ~ 2019-09-31 24:00

● 文章内容来源于小麦苗的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解

● 版权所有,欢迎分享本文,转载请保留出处

........................................................................................................................

● 小麦苗的微店: https://weidian.com/s/793741433?wfr=c&ifr=shopdetail

● 小麦苗出版的数据库类丛书: http://blog.itpub.net/26736162/viewspace-2142121/

● 小麦苗OCP、OCM、高可用网络班: http://blog.itpub.net/26736162/viewspace-2148098/

● 小麦苗腾讯课堂主页: https://lhr.ke.qq.com/

........................................................................................................................

使用 微 信客户端扫描下面的二维码来关注小麦苗的微 信公众号( xiaomaimiaolhr)及QQ群(DBA宝典)、添加小麦苗微 信, 学习最实用的数据库技术。

........................................................................................................................

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26736162/viewspace-2655888/,如需转载,请注明出处,否则将追究法律责任。

Oracle中的insert/insert all/insert first相关推荐

  1. oracle中create table as和insert into select语句

    SELECT INTO , INSERT INTO SELECT 和 CREATE TABLE AS SELECT INSERT INTO SELECT Create table newTable a ...

  2. Oracle中selec ... into ... from 和 insert into ... select...from区别

    1.语句形式为: Insert into Table2(field1,field2,...) select value1,value2,... from Table1  2.注意地方: (1)要求目标 ...

  3. oracle的insert写法,oracle中的insert语句

    关键字: ORACLE insert into table oracle中的insert语句 在oracle中使用DML语言的insert语句来向表格中插入数据,先介绍每次只能插入一条数据的语法 IN ...

  4. oracle+nvlif函数,Oracle中的NVL()、NVL2()、NULLIF()、Coalesce()函数

    大家先来看看下面这道简单的题目: 1.  TEST表包含两个列,TESTCOL定义为数据类型NUMBER(10),TESTCOL_2定义为数据类型VARCHAR2(10).在Oracle中发出下列语句 ...

  5. oracle中nowait怎么用,oracle中UPDATE nowait 的使用方法介绍

    oracle中UPDATE nowait 的使用方法介绍 1.UPDATE nowait 应用以下场景:查询某条数据,并对其开启数据库事务.如果查询的当前数据没有加锁,则正确返回结果,并对当前数据加锁 ...

  6. SQL语句oracle中如何插入Date类型的数据

    在开发的时候,经常要写条SQL语句将信息插入表中,插入的数据如果字段是date类型,就必须将date类型转换成字符串String类型在通过sql语句插入数据库.这是我字段唯一的方法,如果有高人请另赐教 ...

  7. oracle数据库中insert,【Oracle】sql插入之 insert all、insert first

    Oracle插入之 insert all.insert first介绍 利用insert first/all使得INSERT语句可以同时插入多张表,还可以根据判断条件来决定每条记录插入到哪张或哪几张表 ...

  8. 【存储过程】Merge Into语句实现Insert/Update在Oracle中的应用

    最近接到一个新的接口需求,开发一个保存数据的接口,需要完成如下功能:有一个表T,有两个字段a(主键),b,我们想在表T中做Insert/Update,如果存在,则更新T中b的值,如果不存在,则插入一条 ...

  9. oracle数据库 append,oracle中insert,copy,insert append执行对比

    oracle中insert,copy,insert append执行对比 还是由于迁移数据库,测试了insert,copy,insert append的执行速度. 环境:oracle9i向oracle ...

  10. Oracle中insert into select和select into的区别

    文章转自:http://www.linuxidc.com/Linux/2012-09/70984.htm 在Oracle中,将一张表的数据复制到另外一个对象中.通常会有这两种方法:insert int ...

最新文章

  1. Debug时如何跳过(不执行)某些代码
  2. 用Python实现双端队列
  3. UI5 plugin - uploadCollection
  4. java swing 选项卡_java – 如何通过单击按钮在jTabbedPane中切换选项卡?
  5. Spring MVC学习总结(15)——SpringMVC之国际化简单实现
  6. 有效的括号——字符串匹配问题
  7. linux 词霸,Linux中的词霸
  8. Elasticsearch: Cerebro 用户界面介绍
  9. 一步步教你开发鸿蒙系统应用,So Easy
  10. Xp正常及错误系统抓图汇编以及解决方案
  11. 5款 Linux 常用远程连接工具,总有一款适合你
  12. 不按Ctrl键实现select标签多选操作
  13. c语言递归打印99乘法表,递归与循环转换_九九乘法表打印_算法
  14. crfclust.bdb文件过大处理
  15. 微信小程序真机调试步骤
  16. phalapi 数据库锁_2.5 PhalApi 连接多个数据库
  17. 解决pgAdmin4启动失败方法(The pgAdmin 4 sever could not be contacted)
  18. 如何阅读一个前向推理框架?以NCNN为例
  19. 【小月电子】ALTERA FPGA开发板系统学习教程-LESSON12 IPCORE核之FIFO详细教程
  20. 计算机实时控制和过程控制,实时控制程序

热门文章

  1. django之处理execl和zip
  2. 在万彩手影大师上怎么制作微课_制作微课最简单方便的设备?
  3. Hadoop能做什么
  4. 浙大计算机学院研究生读书报告,浙江大学工程师学院研究生读书报告撰写要求与模板...
  5. 字符串去重复的几种方法
  6. 3D模型读取库:Assimp
  7. Android Bluetooth OPP的理解与使用之八
  8. 004 json介绍
  9. ANN人工神经网络(Artificial Neuron Network )
  10. 阿里最全面试116题:阿里天猫、蚂蚁金服、阿里巴巴面试题含答案