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

磐维数据库2.0系列:PG兼容性

原创 #5z# ๑҉ 2024-01-09
1720

磐维数据库,简称"PanWeiDB"。是中国移动信息技术中心首个基于中国本土开源数据库打造的面向ICT基础设施的自研数据库产品。其产品内核能力基于openGauss开源软件,并进一步提升了系统稳定性和多种数据库兼容性。

2024年1月5号,PanWeiDB 2.0.0集中式版本正式对租户发布,本文将介绍新版本增加的部分PG兼容性。

1.对象标识符增加别名类型

磐维数据库在内部使用对象标识符(OID)作为各种系统表的主键。OID的别名类型有两种形式,一种是直接使用别名类型regclass,还有一种是使用函数to_regclass。

PanWeiDB 2.0.0增加了schema的别名类型regnamespace以及to_regnamespace函数,可以根据模式名返回对应命名空间的OID,如果找不到则返回空。

示例如下:

select * from pg_class where relkind='i' and relnamespace = 'public'::regnamespace;

或者是

select * from pg_class where relkind='i' and relnamespace = to_regnamespace('public');

第一种写法简便些,适用于脚本;第二种写法更符合SQL标准。

2.函数及操作符

分类 名称 数据库兼容性 描述
字符处理 ARRAY_POSITIONS PG 返回第一个参数给定的数组中,第二个参数所有出现的位置的下标所组成的数组
JSON/JSONB JSON_STRIP_NULLS PG 用于删除对象中的值为NULL的字段
JSON/JSONB JSONB_BUILD_ARRAY PG 创建JSONB数组
JSON/JSONB JSONB_BUILD_OBJECT PG 造出JSONB对象
JSON/JSONB JSONB_INSERT PG 将新值插入到JSONB值中的指定路径位置
JSON/JSONB JSONB_OBJECT PG 从文本数组构建一个JSONB对象
JSON/JSONB JSONB_PATH_EXISTS PG 检查给定的JSON路径中是否存在指定JSON值
JSON/JSONB JSONB_PATH_QUERY PG 利用SQL/JSON Path特性按照特定路径查询jsonb对象
JSON/JSONB JSONB_PATH_QUERY_ARRAY PG 利用SQL/JSON Path特性按照特定路径查询JSONB对象,并将结果封装为数组
JSON/JSONB JSONB_SET PG 替换指定的路径上的值或者在指定的路径上插入值
JSON/JSONB JSONB_STRIP_NULLS PG 用于删除对象中的值为NULL的字段
JSONB操作符 -操作符 PG 用于从JSON对象中删除键(以及它的值),或从JSON数组中删除匹配的字符串值
JSONB操作符 #-操作符 PG 用于删除jsonb具有指定路径的域或者元素
聚合函数 FILTER过滤 PG COUNT、SUM和AVG函数可使用FILTER子句过滤
数组函数 unnest PG 将一个数组扩展为一组行
消息通知 PG_NOTIFY PG 发送一个通知
消息通知 PG_LISTENING_CHANNELS PG 用于查看注册的监听

3.增加PG原生声明式分区语法

磐维1.0.0只支持Oracle风格的声明式分区,包括范围分区、列表分区、哈希分区以及自动扩展间隔分区。而PostgreSQL支持继承及声明式分区,但不支持自动扩展间隔分区。

对于声明式分区表来说,分区必须具有和分区表正好相同的列集合,表结构必须严格一致,而在表继承中,子表可以有父表中没有出现过的额外列,同时表继承允许多继承。

磐维2.0.0增加了PG原生声明式分区语法,声明式语法分两步:

第一步:创建分区表父表,通过指定PARTITION BY子句把表创建为分区表,包括分区方法以及用作分区键的column列表。

CREATE TABLE [ IF NOT EXISTS ] parent_table_name ( column_name data_type [ COLLATE collation ] [ column_constraint [ ... ] ) [ NOCOMPRESS ] PARTITION BY { RANGE | LIST | HASH } ( partition_key );

第二步:创建子分区,每个分区的定义必须指定对应于父表的分区方法和分区键的边界。

CREATE TABLE [ IF NOT EXISTS ] partition_table_name PARTITION OF parent_table_name FOR VALUES { IN ( partition_value [, ...] ) | FROM ( { partition_value | MINVALUE | MAXVALUE } [, ...] ) TO ( { partition_value | MINVALUE | MAXVALUE } [, ...] ) | WITH ( MODULUS numeric_literal, REMAINDER numeric_literal ) } [ PARTITION BY { RANGE | LIST | HASH } ( partition_key ) ]

4.IMPORT FOREIGN SCHEMA

使用postgres_fdw插件式时,支持IMPORT FOREIGN SCHEMA语法,用于从外部服务器中导入外部服务器查询路径下的全部表,无需逐个手工创建。

默认情况下,外部服务器用户查询模式下的所有表和视图都会被导入。列表也可以被限制到一个指定的子集,或者可以排除特定的表。

5.支持PG原生upsert语法

PanWeiDB 1.0.0版本,upsert语法参考如下:

insert into ... ON DUPLICATE KEY update columnN=excluded.columnN;

PanWeiDB 2.0.0版本,upsert语法增加了兼容原生PG的形式:

insert into ... ON CONFLICT(XXX) do update set columnN=excluded.columnN;

upsert语法在PanWeiDB 2.0.0的版本里更加全面,同时支持openGauss风格和PG风格,尤其是在PG兼容性模式下能同时与autoGeneratedKeys参数使用。

详细请参考磐维数据库upsert语法介绍

6.支持临时序列

create temp sequence seq ... ;

在PG兼容模式下,行存表支持创建临时序列功能,临时序列会在会话退出时删除。

7.支持PG原生cursor语法

游标(cursor)是数据库中的一个数据缓冲区,用于存放SQL语句的执行结果。PanWeiDB 2.0.0支持Oracle和PG两种风格的游标(cursor):

Oracle风格语法如下:

name [ [ NO ] SCROLL ] CURSOR [ ( arguments ) ] FOR query;

PG风格语法如下:

CURSOR name [ [ NO ] SCROLL ] [ ( arguments ) ] FOR query;

8.支持update使用where current of

update命令可使用where current of子句更新游标对应的字段值:

启动transaction

start transaction;

定义游标

declare cursor1 cursor for select * from t1 where col1=1;

抓取头一行到游标cursor1里

fetch forward 1 from cursor1;

更新游标中对应行的字段值

update t1 set col1=0 where current of cursor1;

查看结果

select * from t1;

关闭游标

close cursor1;

最后结束事务

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

评论