Oracle的多表插入
2013-10-10 15:37
295 查看
以前只知道INSERT语句可以在表中插入一行数据,近期了解到关于多表插入的知识,在此记录下来,用以备忘。
一、多表插入的类型:
1、unconditional insert cause
无条件的多表插入,Oracle将会把子查询返回的每一条记录插入到对应的表中。
语法如下:
INSERT ALL
INTO tablename1 values(column1,column2,...)
INTO tablename2 values(column1,column2,...)
subquery;
2、conditional insert cause
有条件的多表插入又可以分为INSETR ALL和INSERT FIRST。Oracle会根据WHEN后的条件过滤插入子句,只有符合条件方可被插入到对应的表中。在带有条件的多表插入语句中最多可以有127个WHEN子句;
语法如下:
INSERT ALL / FIRST
WHEN condition THEN
INTO tablename1 values(column1,column2,...)
WHEN condition THEN
INTO tablename2 values(column1,column2,...)
ELSE
INTO tablename3 values(column1,column2,...)
subquery;
二、INSERT ALL和INSERT FIRST的比较:
1、INSERT ALL
在INSERT ALL语句中,Oracle计算WHEN子句后面的条件,只要条件为true,则插入记录到相应的表当中;
2、INSERT FIRST
在INSERT FIRST语句中,Oracle依次计算WHEN子句后面的条件,如果第一个WHEN子句的条件为true,则跳过后面的WHEN子句;(也就是说,已经插入到一个表中的记录,不会再插入到其他的表中去了)
根据上面的分析可以这样理解,在INSERT FIRST语句中记录的插入与INTO子句在整个语句中的顺序有关。
三、实验
创建两个测试表test_t1和test_t2:
SQL> create table test_t1 (x int primary key,y int);
Table created.
SQL> create table test_t2 (x int primary key,y date);
Table created.
1、执行无条件多表插入:
SQL> insert all
2 into test_t1 values (rownum,object_id)
3 into test_t2 values (rownum,created)
4 select rownum,object_id,created from all_objects where rownum<11;
20 rows created.
SQL> select * from test_t1;
X Y
---------- ----------
1 258
2 259
3 311
4 313
5 314
6 316
7 317
8 319
9 606
10 887
10 rows selected.
SQL> select * from test_t2;
X Y
---------- ---------
1 12-MAR-08
2 12-MAR-08
3 12-MAR-08
4 12-MAR-08
5 12-MAR-08
6 12-MAR-08
7 12-MAR-08
8 12-MAR-08
9 12-MAR-08
10 12-MAR-08
10 rows selected.
2、执行有条件的INSERT ALL多表插入:
SQL> insert all
2 when rownum<7 then
3 into test_t1 values (rownum,object_id)
4 when rownum>5 then
5 into test_t2 values (rownum,created)
6 select rownum,object_id,created from all_objects where rownum<11;
11 rows created.
SQL> select * from test_t1;
X Y
---------- ----------
1 258
2 259
3 311
4 313
5 314
6 316
6 rows selected.
SQL> select * from test_t2;
X Y
---------- ---------
6 12-MAR-08
7 12-MAR-08
8 12-MAR-08
9 12-MAR-08
10 12-MAR-08
5 rows selected.
注意:在这里,rownum为6的记录被插入到两个表当中了。
3、执行有条件的INSERT FIRST多表插入:
SQL> insert first
2 when rownum<7 then
3 into test_t1 values (rownum,object_id)
4 when rownum>5 then
5 into test_t2 values (rownum,created)
6 select rownum,object_id,created from all_objects where rownum<11;
10 rows created.
SQL> select * from test_t1;
X Y
---------- ----------
1 258
2 259
3 311
4 313
5 314
6 316
6 rows selected.
SQL> select* from test_t2;
X Y
---------- ---------
7 12-MAR-08
8 12-MAR-08
9 12-MAR-08
10 12-MAR-08
4 rows selected.
注意:在这里,rownum为6的记录没有被插入到第二个表当中。
英文实在是很烂,官方文档看的很辛苦,暂且就记录这些... ...
一、多表插入的类型:
1、unconditional insert cause
无条件的多表插入,Oracle将会把子查询返回的每一条记录插入到对应的表中。
语法如下:
INSERT ALL
INTO tablename1 values(column1,column2,...)
INTO tablename2 values(column1,column2,...)
subquery;
2、conditional insert cause
有条件的多表插入又可以分为INSETR ALL和INSERT FIRST。Oracle会根据WHEN后的条件过滤插入子句,只有符合条件方可被插入到对应的表中。在带有条件的多表插入语句中最多可以有127个WHEN子句;
语法如下:
INSERT ALL / FIRST
WHEN condition THEN
INTO tablename1 values(column1,column2,...)
WHEN condition THEN
INTO tablename2 values(column1,column2,...)
ELSE
INTO tablename3 values(column1,column2,...)
subquery;
二、INSERT ALL和INSERT FIRST的比较:
1、INSERT ALL
在INSERT ALL语句中,Oracle计算WHEN子句后面的条件,只要条件为true,则插入记录到相应的表当中;
2、INSERT FIRST
在INSERT FIRST语句中,Oracle依次计算WHEN子句后面的条件,如果第一个WHEN子句的条件为true,则跳过后面的WHEN子句;(也就是说,已经插入到一个表中的记录,不会再插入到其他的表中去了)
根据上面的分析可以这样理解,在INSERT FIRST语句中记录的插入与INTO子句在整个语句中的顺序有关。
三、实验
创建两个测试表test_t1和test_t2:
SQL> create table test_t1 (x int primary key,y int);
Table created.
SQL> create table test_t2 (x int primary key,y date);
Table created.
1、执行无条件多表插入:
SQL> insert all
2 into test_t1 values (rownum,object_id)
3 into test_t2 values (rownum,created)
4 select rownum,object_id,created from all_objects where rownum<11;
20 rows created.
SQL> select * from test_t1;
X Y
---------- ----------
1 258
2 259
3 311
4 313
5 314
6 316
7 317
8 319
9 606
10 887
10 rows selected.
SQL> select * from test_t2;
X Y
---------- ---------
1 12-MAR-08
2 12-MAR-08
3 12-MAR-08
4 12-MAR-08
5 12-MAR-08
6 12-MAR-08
7 12-MAR-08
8 12-MAR-08
9 12-MAR-08
10 12-MAR-08
10 rows selected.
2、执行有条件的INSERT ALL多表插入:
SQL> insert all
2 when rownum<7 then
3 into test_t1 values (rownum,object_id)
4 when rownum>5 then
5 into test_t2 values (rownum,created)
6 select rownum,object_id,created from all_objects where rownum<11;
11 rows created.
SQL> select * from test_t1;
X Y
---------- ----------
1 258
2 259
3 311
4 313
5 314
6 316
6 rows selected.
SQL> select * from test_t2;
X Y
---------- ---------
6 12-MAR-08
7 12-MAR-08
8 12-MAR-08
9 12-MAR-08
10 12-MAR-08
5 rows selected.
注意:在这里,rownum为6的记录被插入到两个表当中了。
3、执行有条件的INSERT FIRST多表插入:
SQL> insert first
2 when rownum<7 then
3 into test_t1 values (rownum,object_id)
4 when rownum>5 then
5 into test_t2 values (rownum,created)
6 select rownum,object_id,created from all_objects where rownum<11;
10 rows created.
SQL> select * from test_t1;
X Y
---------- ----------
1 258
2 259
3 311
4 313
5 314
6 316
6 rows selected.
SQL> select* from test_t2;
X Y
---------- ---------
7 12-MAR-08
8 12-MAR-08
9 12-MAR-08
10 12-MAR-08
4 rows selected.
注意:在这里,rownum为6的记录没有被插入到第二个表当中。
英文实在是很烂,官方文档看的很辛苦,暂且就记录这些... ...
相关文章推荐
- C#利用ODP.NET往oracle中高效插入百万数据
- oracle MERGE INTO语句使用方法(有则更新无则插入)
- Oracle中把一个查询结果插入到一张表中
- oracle的timestamp类型使用 插入
- Oracle 使用mybatis插入数据时查出ID selectKey
- Oracle里通过merge语句判断重复插入
- 关于用php插入汉字到oracle中出现不乱码问题
- oracle 插入数据之前判断是否有记录
- 【oracle资料整理】--【3】如何插入修改删除数据
- 简单的多表插入(oracle)
- ORACLE快速插入数据
- Oracle中插入大量测试数据
- oracle常规与直接路径插入(append)区别
- 插入数据到oracle,实现id字段自增的方法
- oracle 插入一个从别处查询获得字段的值
- Oracle 插入大量数据
- Oracle DBLINK 简单使用 oracle在进行跨库访问时,可以通过创建dblink实现,今天就简单的介绍下如果创建dblink,以及通过dblink完成插入、修改、删除等操
- PreparedStatement 批量更新,插入数据到Oracle mysql
- Oracle中如何插入特殊字符:& 和 ' (多种解决方案)
- 记录一下C#+Oracle批量插入的一个方法