#PG SQL转换
本文档基于PG已有语法,根据SQL转换对以下语法进行了规则化的转换。
# 概述
在YMP的任务评估阶段,会对源数据库中的对象(表、视图、约束、索引等)进行兼容性评估,以确保源端数据库对象可以成功迁移到目标数据库。
在评估阶段,会尝试获取源端数据库对象的DDL并在目标数据库执行。如果执行成功,则说明此对象为原生兼容,无需进行特殊处理。
否则,会使用SQL转换工具根据源端到目标端数据库的语法转换规则对此DDL进行语法转换,以适配目标数据库的语法特性。
如果转换成功,会尝试在目标数据库中执行转换后的SQL,执行成功则说明此对象为自动兼容,可以进行迁移。
由于PG没有提供系统的获取对象DDL的方法,所以在评估阶段DDL由YMP平台获取部分元数据信息进行拼接,可能会有部分语法不支持。
# CREATE TABLE
| 序号 | PG语法/关键字 | YashanDB23转换规则 |
|---|---|---|
| 1 | [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] | 保留 TEMPORARY , UNLOGGED转为NOLOGGING |
| 2 | column_name data_type [ COMPRESSION compression_method ] [ COLLATE collation ] | 删除COLLATE信息 |
| 3 | 表内约束 | 转为独立约束对象 |
| 4 | GENERATED ALWAYS AS ( generation_expr ) STORED | 仅在YashanDB版本>=23.4.2时保留 |
| 5 | GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( sequence_options ) ] | 修改其默认值为其默认生成的序列名 |
| 6 | PARTITION BY { RANGE | LIST | HASH } ( { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [, ... ] ) | 只保留YashanDB支持的分区定义信息,由于YashanDB的分区定义需要更多信息,其基本都不兼容 |
| 7 | WITH ( storage_parameter [= value] [, ... ] ) | 删除 |
| 8 | INHERITS ( parent_table [, ... ] ) | 不获取,转为获取其全部字段信息 |
| 9 | TABLESPACE <表空间名> | 保留 |
# CREATE SEQUENCE
| 序号 | PG语法/关键字 | YashanDB23转换规则 |
|---|---|---|
| 10 | AS data_type | 删除 |
| 11 | [ INCREMENT [ BY ] increment ] [ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ] [ START [ WITH ] start ] [ CACHE cache ] [ [ NO ] CYCLE ] | 全部保留,CACHE如果值等于1则不会保留 |
| 12 | OWNED BY { table_name.column_name | NONE } | 不获取,不保留 |
# CREATE INDEX
| 序号 | PG语法/关键字 | YashanDB23转换规则 |
|---|---|---|
| 13 | [ UNIQUE ] | 保留 |
| 14 | [ CONCURRENTLY ] [ [ IF NOT EXISTS ] name ] | 仅保留name |
| 15 | [ ONLY ] | 不获取,不保留 |
| 16 | [ USING method ] | 不保留 |
| 17 | [ COLLATE collation ] [ opclass [ ( opclass_parameter = value [, ... ] ) ] ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] | 仅保留ASC/DESC |
| 18 | [ INCLUDE ( column_name [, ...] ) ] [ WITH ( storage_parameter [= value] [, ... ] ) ] [ TABLESPACE tablespace_name ] [ WHERE predicate ] | 仅保留TABLESPACE |
# CREATE VIEW
| 序号 | PG语法/关键字 | YashanDB23转换规则 |
|---|---|---|
| 19 | [ OR REPLACE ] [ TEMP | TEMPORARY ] [ RECURSIVE ] | 不保留 |
| 20 | [ WITH ( view_option_name [= view_option_value] ) ] | 仅转换CHECK_OPTION |
| 21 | [ WITH [ CASCADED | LOCAL ] CHECK OPTION ] | 不保留CASCADED/LOCAL |
# CREATE MATERIALIZED VIEW
| 序号 | PG语法/关键字 | YashanDB23转换规则 |
|---|---|---|
| 22 | WITH ( storage_parameter [= value] [, ... ] ) | 未获取 |
| 23 | USING method | 未获取 |
| 24 | WITH [ NO ] DATA | 未获取 |
| 25 | TABLESPACE tablespace_name | 保留 |
# 全部示例
# 示例1
-- PG
CREATE TABLE console_4 (
id INTEGER NOT NULL DEFAULT NEXTVAL('console_4_id_seq'::regclass),
name text NOT NULL,
price NUMERIC(10,2) NOT NULL
);
CREATE UNLOGGED TABLE usbit2233 (
user_id CHARACTER varying
);
-- YashanDB23预期结果
CREATE TABLE console_4 (
id INTEGER DEFAULT console_4_id_seq.NEXTVAL ,
name CLOB,
price NUMBER(10,2)
);
CREATE TABLE usbit2233( user_id CLOB
) NOLOGGING;
# 示例2
-- PG
CREATE SEQUENCE drg.bedday_cof_dic_id_seq
AS INTEGER
INCREMENT BY 1 MINVALUE 1 MAXVALUE 2147483647
START 1 CACHE 1 CYCLE;
-- YashanDB23预期结果
CREATE SEQUENCE drg.bedday_cof_dic_id_seq INCREMENT BY 1 MINVALUE 1 MAXVALUE 2147483647 START WITH 1 CYCLE;
# 示例3
-- PG
CREATE INDEX idx_02 ON user_01.tb_01
USING btree (c1 NULLS FIRST, c2 DESC)
INCLUDE (c1, c2)
WHERE (c1 > 0)
-- YashanDB23预期结果
CREATE INDEX idx_02 ON user_01.tb_01 (c1,c2 DESC);
# 示例4
-- PG
CREATE VIEW user_01.view2 WITH (check_option=cascaded) AS SELECT tb_01.c1,
tb_01.c2,
tb_01.c2_2
FROM tb_01;
-- YashanDB23预期结果
CREATE VIEW user_01.view2
AS
SELECT tb_01.c1, tb_01.c2, tb_01.c2_2
FROM tb_01
WITH CHECK OPTION;

