MULTITABLE INSERT
利用INSERT FIRST/ALL使得INSERT语句可以同时插入多张表,还可以根据判断条件来决定每条记录插入到哪张或哪几张表中。区别如下:
INSERT FIRST
:对于每一行数据,只插入到第一个WHEN条件成立的表,不继续检查其他条件。INSERT ALL
:对于每一行数据,对每一个WHEN条件都进行检查,如果满足条件就执行插入操作。
主要语法结构
语法格式
sql
multi_stmt::=
INSERT {FIRST | ALL} WHEN bool_expr THEN insert_into_list [WHEN bool_expr THEN insert_into_list]... ELSE insert_into_list select_no_parens
| INSERT ALL insert_into_list select_no_parens
参数说明
ALL
:如果指定ALL
,则数据库将检查每个WHEN子句,如果每一个WHEN子句均为true,数据库执行相应的插入操作。FIRST
:如果指定FIRST
,则数据库将按照子句在语句中出现的顺序检查WHEN子句,对于检查为true的第一个WHEN子句,数据库将执行insert_into_list子句。ELSE
:对于给定的行,WHEN子句均为false且指定了ELSE子句,则数据库将执行ELSE子句后的insert_into_list
。select_no_parens
:查询语句。
插入内容insert_into_list
语法格式
sql
insert_into_list::=
insert_into_clause [insert_into_clause]...
insert_into_clause::=
INTO name_space [PARTITION (name_list) | SUBPARTITION (name_list)] [(columnList)] VALUES (target_list)
| INTO name_space [PARTITION (name_list) | SUBPARTITION (name_list)] (columnList)
| INTO name_space [PARTITION (name_list) | SUBPARTITION (name_list)] %prec UMINUS
参数说明
name_space
:指定要插入数据的目标表或视图。[PARTITION (name_list) | SUBPARTITION (name_list)]
:可选部分,指定插入到表的特定分区或子分区。VALUES (target_list)
:当使用VALUES关键字时,直接提供要插入的具体值列表。target_list是一系列表达式,对应于columnList
中指定的列。columnList
:如果没有VALUES
关键字,从select_no_parens
查询结果中获取的列。
示例
示例1
INSERT FIRSTsqlSQL> CREATE TABLE ins_tab1(col1 INT,col2 VARCHAR(20),col3 NUMERIC(5,2),col4 DATE); SQL> INSERT INTO ins_tab1 VALUES(11,'AB',111.11,TO_DATE('2007-04-15','YYYY-MM-DD'))(6,'CD',222.22,TO_DATE('2008-04-15','YYYY-MM-DD'))(1,'EF',333.33,TO_DATE('2009-04-15','YYYY-MM-DD'))(4,'GH',444.44,TO_DATE('2010-04-15','YYYY-MM-DD'))(NULL,'GH',555.55,TO_DATE('2011-04-15','YYYY-MM-DD')); SQL> CREATE TABLE ins_tab2(col1 INT,col2 VARCHAR(20),col3 NUMERIC(5,2),col4 DATE); SQL> CREATE TABLE ins_tab3(col1 INT,col2 VARCHAR(20),col3 NUMERIC(5,2),col4 DATE); SQL> INSERT FIRST WHEN col1>10 THEN INTO ins_tab2 VALUES(col1,col2,col3,col4) WHEN col1>3 THEN INTO ins_tab3 VALUES(col1,col2,col3,col4) SELECT col1,col2,col3,col4 FROM ins_tab1; SQL> SELECT * FROM ins_tab2; COL1 | COL2 | COL | COL4 | ------------------------------------------------------------------------------ 11 | AB| 111.11| 2007-04-15 AD | SQL> SELECT * FROM ins_tab3; COL1 | COL2 | COL | COL4 | ------------------------------------------------------------------------------ 6 | CD| 222.22| 2008-04-15 AD | 4 | GH| 444.44| 2010-04-15 AD |
示例2
INSERT ALLsqlSQL> CREATE TABLE ins_tab1(col1 INT,col2 VARCHAR(20),col3 NUMERIC(5,2),col4 DATE); SQL> INSERT INTO ins_tab1 VALUES(11,'AB',111.11,TO_DATE('2007-04-15','YYYY-MM-DD'))(6,'CD',222.22,TO_DATE('2008-04-15','YYYY-MM-DD'))(1,'EF',333.33,TO_DATE('2009-04-15','YYYY-MM-DD'))(4,'GH',444.44,TO_DATE('2010-04-15','YYYY-MM-DD'))(NULL,'GH',555.55,TO_DATE('2011-04-15','YYYY-MM-DD')); SQL> CREATE TABLE ins_tab2(col1 INT,col2 VARCHAR(20),col3 NUMERIC(5,2),col4 DATE); SQL> CREATE TABLE ins_tab3(col1 INT,col2 VARCHAR(20),col3 NUMERIC(5,2),col4 DATE); SQL> INSERT ALL WHEN col1>10 THEN INTO ins_tab2 VALUES(col1,col2,col3,col4) WHEN col1>3 THEN INTO ins_tab3 VALUES(col1,col2,col3,col4) SELECT col1,col2,col3,col4 FROM ins_tab1; SQL> SELECT * FROM ins_tab2; COL1 | COL2 | COL | COL4 | ------------------------------------------------------------------------------ 11 | AB| 111.11| 2007-04-15 AD | SQL> SELECT * FROM ins_tab3; COL1 | COL2 | COL | COL4 | ------------------------------------------------------------------------------ 11 | AB| 111.11| 2007-04-15 AD | 6 | CD| 222.22| 2008-04-15 AD | 4 | GH| 444.44| 2010-04-15 AD |
说明:
- 多表插入前面的条件表达式和VALUES中的字段必须出现在后续的查询输出列中。
- 多表插入时插入对象不支持为视图。
- 与Oracle设计差异部分:情况1:如果条件字段不在后续查询输出字段中不报错可插入成功。情况2:如果插入VALUE中的字段不在后续查询输出字段中不报错可插入成功。