我们目标是 把 PostgreSQL 的 SQL dump 适配到 openGauss。openGauss 是基于 PostgreSQL 9.2 分支演化的,但它并不是 100% 兼容,需要特别注意。结合你提供的 dump 文件和 openGauss 的兼容性,我总结如下:
🔑 需要修改的部分
1. 扩展(Extension)
-
PostgreSQL 里:
sqlCREATE EXTENSION IF NOT EXISTS "uuid-ossp"; -
openGauss 不支持 extension,uuid-ossp 也不可用。
-
解决办法 :用 openGauss 内置的
gen_random_uuid()或sys_guid()替代。scssid uuid DEFAULT gen_random_uuid() NOT NULL
2. UUID
-
PostgreSQL:
uuid DEFAULT uuid_generate_v4() -
openGauss:支持
uuid类型,但没有uuid_generate_v4()。 -
修改:
scssDEFAULT uuid_generate_v4() → DEFAULT gen_random_uuid()
3. JSON 与 JSONB
-
PostgreSQL 支持
json/jsonb。 -
openGauss 只支持
json,不支持jsonb。 -
修改:
jsonb → json
4. 时间类型
-
PostgreSQL:
sqltimestamp without time zone -
openGauss:只支持
timestamp,语法中没有without time zone这一套。 -
修改:
sqltimestamp without time zone → timestamp timestamp(6) without time zone → timestamp(6) -
同时,
CURRENT_TIMESTAMP(0)在 openGauss 里直接用CURRENT_TIMESTAMP或SYSTIMESTAMP。
5. 序列与自增
-
PostgreSQL:
bashid integer DEFAULT nextval('public.task_id_sequence'::regclass) -
openGauss:支持
CREATE SEQUENCE,但推荐用 IDENTITY 列。 -
修改:
vbnetid integer GENERATED BY DEFAULT AS IDENTITY或保持
create sequence+nextval('xxx'),但要去掉::regclass。
6. 二进制类型
- PostgreSQL:
bytea - openGauss:支持
bytea,但在某些版本里更推荐blob。 - 修改建议 :保留
bytea(兼容),如果报错则替换成blob。
7. 类型强制转换
-
PostgreSQL 常见:
php'active'::character varying '{}'::text -
openGauss 不支持
::这种写法,要改成CAST(...). -
修改:
sql'active'::character varying → CAST('active' AS varchar) '{}'::text → CAST('{}' AS text)
8. 系统函数
-
PostgreSQL dump 中有:
arduino(now() AT TIME ZONE 'UTC'::text) -
openGauss 不支持
AT TIME ZONE。 -
修改:
- 用
CURRENT_TIMESTAMP或LOCALTIMESTAMP代替。 - 如果必须存 UTC,可以在应用层转换。
- 用
9. 注释
COMMENT ON EXTENSION、COMMENT ON COLUMN保持兼容,一般不用修改。
⚠️ 注意事项
-
索引
- 如果 dump 文件里有
USING gin、USING gist之类的索引,openGauss 不完全支持,需要调整。 - JSONB 的 GIN 索引不可用。
- 如果 dump 文件里有
-
函数与触发器
- PostgreSQL 自定义函数(如
plpgsql)可能需要改为 openGauss 兼容语法。
- PostgreSQL 自定义函数(如
-
大小写
- openGauss 默认把未加引号的表名/列名转小写,迁移时要注意是否需要加
""保留大小写。
- openGauss 默认把未加引号的表名/列名转小写,迁移时要注意是否需要加
-
性能参数
- PostgreSQL 的
WITH (OIDS=FALSE)、TABLESPACE、FILLFACTOR在 openGauss 里大多无效,需删除。
- PostgreSQL 的
✅ 总结:迁移时必改的点
- 去掉
CREATE EXTENSION "uuid-ossp" uuid_generate_v4()→gen_random_uuid()jsonb→jsontimestamp without time zone→timestampDEFAULT CURRENT_TIMESTAMP(0)→DEFAULT CURRENT_TIMESTAMPnextval('xxx'::regclass)→nextval('xxx')或IDENTITY- 类型转换
::→CAST() - 去掉
AT TIME ZONE表达式