我们目标是 把 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
→json
timestamp without time zone
→timestamp
DEFAULT CURRENT_TIMESTAMP(0)
→DEFAULT CURRENT_TIMESTAMP
nextval('xxx'::regclass)
→nextval('xxx')
或IDENTITY
- 类型转换
::
→CAST()
- 去掉
AT TIME ZONE
表达式