可获得性
本特性自MogDB 5.0.0版本开始引入。
特性简介
Oracle 9i版本中新增了Insert All/First语法,扩充了原有的Insert语法,使得Insert语句从原来的只能插入到一张表扩展到可以同时插入多张表,还可以根据判断条件来决定每条数据插入到哪张表中,这样之前的多个Insert语句可以合并到一条语句中,避免数据重复扫描。Insert All和Insert First语句,两者语法基本一致,唯一区别是:Insert first对于每一行数据,只插入到第一个when条件成立的表,不继续检查其他条件, Insert All:对于每一行数据,对每个when条件都进行检查,如果满足条件都进行插入。本特性对Oracle的Insert All/First功能实现了兼容。
客户价值
增强MogDB与Oracle的兼容性,减少应用程序的迁移代价。
特性描述
日常生产生活中经常会遇到需要将一批数据按照不同条件插入的不同的表中,例如将全国范围内采集的个人信息,按照个人籍贯插入到对应的省表中。对于普通的Insert语句,每个省份都需要查询扫描全部数据过滤自己本省信息,插入到本省对应的表中,这样全量的数据需要扫描多次。
MogDB对Oracle的Insert All/First功能进行兼容,Insert语句从原来的只能插入到一张表扩展到可以同时插入多张表,还可以根据判断条件来决定每条数据插入到哪张表中,这样之前的多个Insert语句可以合并到一条语句中,避免数据重复扫描。执行结果与Oracle一致,执行过程中无core,无与Oracle不一致的异常报错,唯一区别是MogDB不支持error_log_clause语法。
特性约束
- 不支持对应Oracle中的error_log_clause语法。
语法描述
Oracle的Insert语法定义如下:



MogDB的语法规则与上述Oracle的语法规则基本一致,唯一区别是MogDB不支持error_log_clause。
此外,MogDB支持Explain Analyze查看每个表具体插入的行数,如下图所示:

示例
-- 创建表,插入测试数据
CREATE TABLE tt02 (a INT, b INT, a1 INT, b1 INT);
INSERT INTO tt02
VALUES (generate_series(1, 10), generate_series(11, 20), generate_series(21, 30), generate_series(31, 40));
CREATE TABLE tt02_1 (a INT);
CREATE TABLE tt02_2 (a INT, b INT);
CREATE TABLE tt02_3 (a1 INT, b1 INT);
CREATE TABLE tt02_4 (a INT, b INT, a1 INT, b1 INT);
-- 功能用例 Insert all
INSERT ALL
WHEN a1 < 25 THEN
INTO tt02_1(a) VALUES(a)
INTO tt02_2(a, b) VALUES(a, b)
WHEN a1 < 30 THEN
INTO tt02_3(a1, b1) VALUES(a, a1)
INTO tt02_4(a, b1) VALUES(b, a1)
ELSE
INTO tt02_4(a, b) VALUES(a, b)
INTO tt02_4(a, b) VALUES(a, b)
SELECT a, b, a1 FROM tt02;
-- 执行结果
MogDB =# SELECT * FROM tt02_1 ORDER BY a; a
---
1
2
3
4
(4 rows)
MogDB=# SELECT * FROM tt02_2 ORDER BY a, b;
a | b
---+----
1 | 11
2 | 12
3 | 13
4 | 14
(4 rows)
MogDB=# SELECT * FROM tt02_3 ORDER BY a1, b1;
a1 | b1
----+----
1 | 21
2 | 22
3 | 23
4 | 24
5 | 25
6 | 26
7 | 27
8 | 28
9 | 29
(9 rows)
MogDB=# SELECT * FROM tt02_4 ORDER BY a, b, a1, b1;
a | b | a1 | b1
----+----+----+----
10 | 20 | |
10 | 20 | |
11 | | | 21
12 | | | 22
13 | | | 23
14 | | | 24
15 | | | 25
16 | | | 26
17 | | | 27
18 | | | 28
19 | | | 29
(11 rows)
-- 功能用例 Insert First
TRUNCATE TABLE tt02_1;
TRUNCATE TABLE tt02_2;
TRUNCATE TABLE tt02_3;
TRUNCATE TABLE tt02_4;
INSERT first
WHEN a1 < 25 THEN
INTO tt02_1(a) VALUES (a)
INTO tt02_2(a, b) VALUES (a, b)
WHEN a1 < 30 THEN
INTO tt02_3(a1, b1) VALUES (a, a1)
INTO tt02_4(a, b1) VALUES (b, a1)
ELSE
INTO tt02_4(a, b) VALUES (a, b)
INTO tt02_4(a, b) VALUES (a, b)
SELECT a, b, a1 FROM tt02;
-- 执行结果
MogDB=# SELECT * FROM tt02_1 ORDER BY a;
a
---
1
2
3
4
(4 rows)
MogDB=# SELECT * FROM tt02_2 ORDER BY a, b;
a | b
---+----
1 | 11
2 | 12
3 | 13
4 | 14
(4 rows)
MogDB=# SELECT * FROM tt02_3 ORDER BY a1, b1;
a1 | b1
----+----
5 | 25
6 | 26
7 | 27
8 | 28
9 | 29
(5 rows)
MogDB=# SELECT * FROM tt02_4 ORDER BY a, b, a1, b1;
a | b | a1 | b1
----+----+----+----
10 | 20 | |
10 | 20 | |
15 | | | 25
16 | | | 26
17 | | | 27
18 | | | 28
19 | | | 29
(7 rows)




