Skip to content

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 FIRST

    sql
    SQL> 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 ALL

    sql
    SQL> 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中的字段不在后续查询输出字段中不报错可插入成功。