磐维数据库,简称"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;




