金仓数据库KingbaseES DML语句介绍 INSERT ALL FIRST

关键字:

KingbaseES、INSERT、INSERT ALL、INSERT FIRST;人大金仓;KingbaseES

INSERT ALL FIRST语句介绍

在KingbaseES数据库中,兼容了ORACLE的INSERT ALL | FIRST功能。使用该类语句,可以同时插入多表、或根据条件语句插入不同的表。本文将主要介绍以下内容:INSERT ALL | FIRST语法、INSERT ALL | FIRST基础用法。

INSERT ALL | FIRST语法

INSERT ALL语句可以选择是否使用WHERE条件,但INSERT FIRST必须使用WHERE条件。使用INSERT ALL | FIRST 语法执行插入次数由最后子查询决定。INSERT ALL 会在插入时向所有满足条件的表进行插入;INSERT FIRST则会向第一满足条件的表进行插入。

不使用条件的INSERT ALL语法如下:

INSERT ALL into_clause [into_clause].. subquery;

into_clause ::=

INTO [schema.]{table_name|view_name} [t_alias][(column_name [,column_name]..)] [values_clause]

使用条件的INSERT ALL | FIRST

INSERT {ALL|FIRST} condition_clause [condition_clause].. condition_else_clause subquery;

condition_clause ::=

WHEN condition_expr THEN into_clause [into_clause]..

condition_else_clause ::=

[ELSE into_clause [into_clause]..]

INSERT ALL | FIRST基础用法

接下来通过测试用例的方式展示INSERT ALL | FIRST的相关用法。

  • 使用无条件的INSERT ALL可以插入同时向多表插入单条数据。

–创建待插入表t1、t2、t3

create table t1(id int, grade int);

create table t2(id int, grade int);

create table t3(id int, grade int);

–向t1,t2,t3插入数据

insert all

into t1 values (1,11)

into t2 values (1,12)

into t3 values (1,13)

select 1;

–查询表t1、t2、t3的数据,插入成功

select * from t1;

select * from t2;

select * from t3;

  • 使用无条件的INSERT ALL向表中插入多条数据

–向t1,t2,t3插入数据

insert all

into t1 values (2,21)

into t2 values (2,22)

into t3 values (2,23)

select generate_series(1,5);

select * from t1;

select * from t2;

select * from t3;

  • 使用有条件的INSERT ALL进行插入, 在省略条件时,会与前面有条件的表的插入条件一致。

–执行下方语句会在产生序列值等于1时插入t1,产生序列值大于3时插入t2,t3

insert all

when num=1 then into t1 values (num+2,21)

when num>3 then into t2 values (num+2,22)

into t3 values (num+2,23)

select generate_series(1,5) as num;

select * from t1;

select * from t2;

select * from t3;

  • 使用INSERT FIRST插入数据,会插入第一个符合条件的数据

–使用insert first插入,下方测试用例插入t2的实际条件是num>3 and num!=4

insert first

when num=4 then into t1 values (num+7,41)

when num>3 then into t2 values (num+7,42)

else into t3 values (num+7,43)

select generate_series(1,5) as num;

–num=4时,t1才被插入

Select * from t1;

–num=4时,不会被插入,使用INSERT ALL则会插入num=4的情况

Select * from t2;

Select * from t3;

  • KingbaseES的INSERT ALL | FIRST支持使用partition关键字和分区表名的方式插入分区表。

–创建一个分区表

CREATE TABLE t5 (id INT, grade int ) PARTITION BY RANGE ( id ) (

PARTITION P5

VALUES LESS THAN ( 5 ),

PARTITION P10

VALUES LESS THAN ( 10 ),

PARTITION P15

VALUES LESS THAN ( 15 )

);

insert first

when num<5 then into t5 partition (P5) values (num,11)

when num<10 then into t5_P10 values (num,12)

else into t5 values (num,13)

select generate_series(1,14) as num;

Select * from t5_p5;

Select * from t5_p10;

Select * from t5_p15;

–使用这种方式插入时需要注意分区约束,上方语句更改为insert all将分区约束检查失败

insert all

when num<5 then into t5 partition (P5) values (num,11)

when num<10 then into t5_P10 values (num,12)

else into t5 values (num,13)

select generate_series(1,14) as num;

总结

在KingbaseES中提供了INSERT ALL | FIRST命令插入多个表。在使用该命令时,需要注意INSERT ALL将插入所有满足条件的表,而INSERT FIRST只会插入第一个满足条件的表。插入命令执行次数由子查询的结果决定。

参考资料

《KingbaseES产品手册》