您的位置:首页 > 数据库 > Oracle

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

英文实在是很烂,官方文档看的很辛苦,暂且就记录这些... ...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  oracle sql insert all first