以前只知道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的记录没有被插入到第二个表当中。
英文实在是很烂,官方文档看的很辛苦,暂且就记录这些... ...