暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MogDB支持Insert All特性

原创 MogDB 2024-08-06
180

可获得性

本特性自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语法定义如下:

img

img

img

MogDB的语法规则与上述Oracle的语法规则基本一致,唯一区别是MogDB不支持error_log_clause。

此外,MogDB支持Explain Analyze查看每个表具体插入的行数,如下图所示:

img

示例

-- 创建表,插入测试数据 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)
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论