Oracle的多表插入

来源:互联网 发布:vscode golang 编译 编辑:程序博客网 时间:2024/05/29 16:42

以前只知道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的记录没有被插入到第二个表当中。

英文实在是很烂,官方文档看的很辛苦,暂且就记录这些... ...


原创粉丝点击