#元数据转换规则

本文档统计YMP对源端的DDL进行兼容性转换所涉及的转换规则。

# 元数据转换规则

编号 转换规则 影响对象 说明
1 手动修改 -- 用户在评估界面上手动修改或者批量修改DDL
2 移除not null约束 MySQL与DM的空字符串和null在YashanDB中都是null,迁移空字符串如果违反非空约束,迁移过程中删除非空约束
3 数据类型转换 YashanDB没有该数据类型,需要转换
4 自增列转序列 MySQL的auto_increment(或者Oracle与DM的自增列)转换成YashanDB的序列
5 on update current_timestamp转触发器 MySQL的on update current_timestamp转换成YashanDB的触发器
6 衍生对象 序列、触发器 自增列转序列,MySQL的on update current_timestamp语法转触发器
7 序列起始值修改 序列 YMP界面批量修改序列起始值
8 临时表转全局临时表 MySQL临时表转换成YashanDB的public TEMPORARY
9 移除版本注释 移除MySQL表DDL的版本注释,如/*!50500 */,可见样例
10 移除表的参数 移除表DDL中的YashanDB不支持的表参数语法
11 移除列的参数 移除表DDL中的YashanDB不支持的列参数语法
12 移除分区信息 移除分区表DDL中的YashanDB不支持的分区参数语法
13 移除子分区 仅支持YashanDB22.2版本,YashanDB22.2版本不支持分区表的子分区,DM无此规则
14 约束提取为单独对象 表DDL中的约束(非空约束、主键约束、唯一约束、检查约束,外键约束)提取出作为单独对象
15 注释提取为单独语句 表DDL中的注释提取出作为单独的DDL,DM无此规则
16 移除视图创建前缀信息 视图 MySQL的视图创建前缀信息[SQL SECURITY { DEFINER \
17 移除视图创建后缀信息 视图 MySQL的视图创建后缀信息[WITH [CASCADED \
18 EVENT转JOB EVENT MySQL的EVENT转换成YashanDB的JOB
19 移除用户信息 视图、触发器、存储过程、函数 MySQL的初始的DDL包含ALGORITHM=UNDEFINED DEFINER=root@%,需要移除
20 移除NOLOGGING 表、索引 YMP的创建任务界面中可设置是否忽略NOLOGGING参数,设置为true,将移除Oracle的表和索引中的NOLOGGING参数
21 移除索引参数 索引 Oracle与DM的索引的部分参数在Yashandb中不支持,需要移除进行兼容
22 移除序列参数 序列 Oracle的序列参数(NOKEEP、NOSCALE、GLOBAL),DM的序列参数(LOCAL)在YashanDB中不支持,需要移除进行兼容

# 全部示例

# 示例3

-- MySQL
CREATE TABLE `data_type_test` (
  `id` mediumint DEFAULT NULL,
  `id01` DECIMAL(10,0) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

-- YashanDB
CREATE TABLE "DATA_TYPE_TEST" (
	"ID" INT DEFAULT NULL,
	"ID01" NUMBER DEFAULT NULL
);
-- 注意:mediumint转换成INT类型,decimal(10,0)转换成NUMBER类型

# 示例4

-- MySQL
CREATE TABLE `auto_increment_tab` (
  `id` INT NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

-- YashanDB
CREATE TABLE "AUTO_INCREMENT_TAB" (
	"ID" INT DEFAULT "AUTO_INCREMENT_TAB_ID_SEQ".NEXTVAL 
);
-- 注意:AUTO_INCREMENT 转换成了 "AUTO_INCREMENT_TAB_ID_SEQ".NEXTVAL

-- Oracle
CREATE TABLE "TEST"."TB_TEST" 
   (	"ID" NUMBER GENERATED ALWAYS AS IDENTITY MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER  NOCYCLE  NOKEEP  NOSCALE , 
	"NAME" VARCHAR2(100)
   ) SEGMENT CREATION DEFERRED 
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
 NOCOMPRESS LOGGING
  TABLESPACE "USERS" ;
  
-- YashanDB
CREATE TABLE "TEST"."TB_TEST" (
	"ID" NUMBER DEFAULT "TEST"."TB_TEST_ID_SEQ".NEXTVAL ,
	"NAME" VARCHAR(100)
)
PCTFREE 10
PCTUSED 40
INITRANS 1
MAXTRANS 255
NOCOMPRESS
LOGGING
TABLESPACE "USERS";
-- 注意:GENERATED ALWAYS AS IDENTITY 转换成了 "TEST"."TB_TEST_ID_SEQ".NEXTVAL

# 示例5

-- MySQL
CREATE TABLE `on_update_test` (
  `t1` TIMESTAMP(3) NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

-- YashanDB
CREATE TABLE "ON_UPDATE_TEST" (
	"T1" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP()
) ;
-- 注意:ON UPDATE CURRENT_TIMESTAMP(3) 转换成了衍生对象触发器

# 示例8

-- MySQL
CREATE TEMPORARY TABLE `temp_table` (
  `id` INT DEFAULT NULL,
  `name` VARCHAR(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

-- YashanDB
CREATE GLOBAL TEMPORARY TABLE "TEMP_TABLE" (
	"ID" INT DEFAULT NULL,
	"NAME" VARCHAR(20 CHAR) DEFAULT NULL
);
-- 注意:TEMPORARY 转换成了 GLOBAL TEMPORARY

# 示例9

-- MySQL
CREATE TABLE `partition_option` (
  `empno` VARCHAR(20) NOT NULL,
  `empname` VARCHAR(20) DEFAULT NULL,
  `deptno` INT DEFAULT NULL,
  `birthdate` year NOT NULL,
  `salary` INT DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci MIN_ROWS=1 MAX_ROWS=100
/*!50100 PARTITION BY RANGE (`birthdate`)
(PARTITION p1 VALUES LESS THAN (1980) MAX_ROWS = 100 MIN_ROWS = 1 ENGINE = InnoDB,
 PARTITION p2 VALUES LESS THAN (1990) MAX_ROWS = 100 MIN_ROWS = 1 ENGINE = InnoDB,
 PARTITION p3 VALUES LESS THAN MAXVALUE MAX_ROWS = 100 MIN_ROWS = 1 ENGINE = InnoDB) */
 
-- YashanDB
CREATE TABLE "PARTITION_OPTION" (
	"EMPNO" VARCHAR(20 CHAR),
	"EMPNAME" VARCHAR(20 CHAR) DEFAULT NULL,
	"DEPTNO" INT DEFAULT NULL,
	"BIRTHDATE" SMALLINT,
	"SALARY" INT DEFAULT NULL
)
PARTITION BY RANGE ("BIRTHDATE")
 ( PARTITION "P1" VALUES LESS THAN (1980) , PARTITION "P2" VALUES LESS THAN (1990) , PARTITION "P3" VALUES LESS THAN (MAXVALUE) );
-- 注意:移除/*!50100 */

# 示例10

-- MySQL
CREATE TABLE `auto_increment_tab` (
  `id` INT NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

-- YashanDB
CREATE TABLE "AUTO_INCREMENT_TAB" (
	"ID" INT DEFAULT "AUTO_INCREMENT_TAB_ID_SEQ".NEXTVAL 
)
;
-- 注意:移除ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

# 示例11

-- MySQL
CREATE TABLE `remove_col_option` (
  `id` INT NOT NULL /*!50606 COLUMN_FORMAT FIXED */ 
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

-- YashanDB
CREATE TABLE "REMOVE_COL_OPTION" (
	"ID" INT
)
;
-- 注意:移除COLUMN_FORMAT FIXED

# 示例12

-- MySQL
CREATE TABLE `partition_option` (
  `empno` VARCHAR(20) NOT NULL,
  `empname` VARCHAR(20) DEFAULT NULL,
  `deptno` INT DEFAULT NULL,
  `birthdate` year NOT NULL,
  `salary` INT DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci MIN_ROWS=1 MAX_ROWS=100
/*!50100 PARTITION BY RANGE (`birthdate`)
(PARTITION p1 VALUES LESS THAN (1980) MAX_ROWS = 100 MIN_ROWS = 1 ENGINE = InnoDB,
 PARTITION p2 VALUES LESS THAN (1990) MAX_ROWS = 100 MIN_ROWS = 1 ENGINE = InnoDB,
 PARTITION p3 VALUES LESS THAN MAXVALUE MAX_ROWS = 100 MIN_ROWS = 1 ENGINE = InnoDB) */

-- YashanDB
CREATE TABLE "PARTITION_OPTION" (
	"EMPNO" VARCHAR(20 CHAR),
	"EMPNAME" VARCHAR(20 CHAR) DEFAULT NULL,
	"DEPTNO" INT DEFAULT NULL,
	"BIRTHDATE" SMALLINT,
	"SALARY" INT DEFAULT NULL
)
PARTITION BY RANGE ("BIRTHDATE")
 ( PARTITION "P1" VALUES LESS THAN (1980) , PARTITION "P2" VALUES LESS THAN (1990) , PARTITION "P3" VALUES LESS THAN (MAXVALUE) )
;
-- 注意:移除分区的参数MAX_ROWS = 100 MIN_ROWS = 1 ENGINE = InnoDB

# 示例13

-- MySQL
CREATE TABLE `tb_sub` (
  `id` INT DEFAULT NULL,
  `purchased` year DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
PARTITION BY RANGE (`purchased`)
SUBPARTITION BY HASH (`purchased`)
SUBPARTITIONS 2
(PARTITION p0 VALUES LESS THAN (1990) ENGINE = InnoDB,
 PARTITION p1 VALUES LESS THAN (2000) ENGINE = InnoDB,
 PARTITION p2 VALUES LESS THAN MAXVALUE ENGINE = InnoDB)
 
-- YashanDB 22.2
 CREATE TABLE "TB_SUB" (
	"ID" INT DEFAULT NULL,
	"PURCHASED" SMALLINT DEFAULT NULL
)
PARTITION BY RANGE ("PURCHASED")
 ( PARTITION p0 VALUES LESS THAN (1990) , PARTITION p1 VALUES LESS THAN (2000) , PARTITION p2 VALUES LESS THAN (MAXVALUE) )
;
-- 注意:移除子分区SUBPARTITION

# 示例14

-- MySQL
CREATE TABLE `remove_tab_option` (
  `id` INT NOT NULL ,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1231 DEFAULT CHARSET=utf8mb3 COMMENT='xxx'

-- YashanDB
CREATE TABLE "REMOVE_TAB_OPTION" (
	"ID" INT 
);
-- 注意:提取非空约束为单独对象

# 示例15

-- MySQL
CREATE TABLE `remove_tab_option` (
  `id` INT COMMENT 'xxx',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1231 DEFAULT CHARSET=utf8mb3 COMMENT='xxx'

-- YashanDB
CREATE TABLE "REMOVE_TAB_OPTION" (
	"ID" INT 
)
;
COMMENT ON COLUMN "REMOVE_TAB_OPTION"."ID" IS 'xxx';
COMMENT ON TABLE "REMOVE_TAB_OPTION" IS 'xxx';
-- 注意:提取列注释、表注释为单独语句

# 示例16

-- MySQL
CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`%` SQL SECURITY DEFINER VIEW `test1702`.`test_view` AS SELECT `test1702`.`partition_option`.`empno` AS `empno`,`test1702`.`partition_option`.`empname` AS `empname`,`test1702`.`partition_option`.`deptno` AS `deptno`,`test1702`.`partition_option`.`birthdate` AS `birthdate`,`test1702`.`partition_option`.`salary` AS `salary` FROM `test1702`.`partition_option`

-- YashanDB
CREATE VIEW "TEST1702"."TEST_VIEW"
AS
SELECT "TEST1702"."PARTITION_OPTION"."EMPNO" AS "EMPNO", "TEST1702"."PARTITION_OPTION"."EMPNAME" AS "EMPNAME", "TEST1702"."PARTITION_OPTION"."DEPTNO" AS "DEPTNO", "TEST1702"."PARTITION_OPTION"."BIRTHDATE" AS "BIRTHDATE", "TEST1702"."PARTITION_OPTION"."SALARY" AS "SALARY"
FROM "TEST1702"."PARTITION_OPTION";
-- 注意:移除SQL SECURITY DEFINER

# 示例17

-- MySQL
CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`%` SQL SECURITY DEFINER VIEW `test1702`.`test_view1` AS SELECT `test1702`.`partition_option`.`empno` AS `empno`,`test1702`.`partition_option`.`empname` AS `empname`,`test1702`.`partition_option`.`deptno` AS `deptno`,`test1702`.`partition_option`.`birthdate` AS `birthdate`,`test1702`.`partition_option`.`salary` AS `salary` FROM `test1702`.`partition_option` WITH CASCADED CHECK OPTION

-- YashanDB
CREATE VIEW "TEST1702"."TEST_VIEW1"
AS
SELECT "TEST1702"."PARTITION_OPTION"."EMPNO" AS "EMPNO", "TEST1702"."PARTITION_OPTION"."EMPNAME" AS "EMPNAME", "TEST1702"."PARTITION_OPTION"."DEPTNO" AS "DEPTNO", "TEST1702"."PARTITION_OPTION"."BIRTHDATE" AS "BIRTHDATE", "TEST1702"."PARTITION_OPTION"."SALARY" AS "SALARY"
FROM "TEST1702"."PARTITION_OPTION";
-- 注意:移除WITH CASCADED CHECK OPTION

# 示例18

-- MySQL
CREATE DEFINER=`root`@`%` EVENT `myevent` ON SCHEDULE AT '2024-02-22 02:44:02' ON COMPLETION NOT PRESERVE ENABLE DO UPDATE myschema.mytable SET mycol = mycol + 1

-- YashanDB
EXEC DBMS_SCHEDULER.CREATE_JOB('test1702.myevent',
'PLSQL_BLOCK', 
'BEGIN UPDATE myschema.mytable SET mycol = mycol + 1 ;  END ;' ,
0,
TO_TIMESTAMP('2024-02-22 02:44:02', 'YYYY-MM-DD HH24:MI:SS'),
null,
null,
'DEFAULT_JOB_CLASS',
false,
true,
'')
-- 注意:MySQL的EVENT转换成Yashandb JOB

# 示例19

-- MySQL
CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`%` SQL SECURITY DEFINER VIEW `test1702`.`test_view1` AS SELECT `test1702`.`partition_option`.`empno` AS `empno`,`test1702`.`partition_option`.`empname` AS `empname`,`test1702`.`partition_option`.`deptno` AS `deptno`,`test1702`.`partition_option`.`birthdate` AS `birthdate`,`test1702`.`partition_option`.`salary` AS `salary` FROM `test1702`.`partition_option` WITH CASCADED CHECK OPTION

-- YashanDB
CREATE VIEW "TEST1702"."TEST_VIEW1"
AS
SELECT "TEST1702"."PARTITION_OPTION"."EMPNO" AS "EMPNO", "TEST1702"."PARTITION_OPTION"."EMPNAME" AS "EMPNAME", "TEST1702"."PARTITION_OPTION"."DEPTNO" AS "DEPTNO", "TEST1702"."PARTITION_OPTION"."BIRTHDATE" AS "BIRTHDATE", "TEST1702"."PARTITION_OPTION"."SALARY" AS "SALARY"
FROM "TEST1702"."PARTITION_OPTION";
-- 注意:移除ALGORITHM=UNDEFINED DEFINER=`root`@`%`

# 示例20

-- Oracle
CREATE TABLE "TEST"."TAB004" 
   (	"ID" NUMBER(*,0)
   ) SEGMENT CREATION DEFERRED 
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
 NOCOMPRESS NOLOGGING
  TABLESPACE "USERS" ;
  
 CREATE INDEX "TEST"."IDX05" ON "TEST"."TAB004" ("ID") 
  PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS NOLOGGING 
  TABLESPACE "USERS" ;

-- YashanDB
CREATE TABLE "TEST"."TAB004" 
   (	"ID" NUMBER(*,0)
   ) SEGMENT CREATION DEFERRED 
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
 NOCOMPRESS  TABLESPACE "USERS" ;
 
CREATE INDEX "TEST"."IDX05" ON "TEST"."TAB004" ( "ID" ) 
PCTFREE 10
INITRANS 2
MAXTRANS 255
TABLESPACE "USERS";

-- 注意:移除NOLOGGING

# 示例21

-- Oracle
CREATE INDEX "TEST"."IDX01" ON "TEST"."PT_HASH_TEST" ("PID") 
  PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
  TABLESPACE "USERS" ;

-- YashanDB
CREATE INDEX "TEST"."IDX01" ON "TEST"."PT_HASH_TEST" ( "PID" ) 
PCTFREE 10
INITRANS 2
MAXTRANS 255
TABLESPACE "USERS";

-- 注意:移除COMPUTE STATISTICS 

# 示例22

-- Oracle
CREATE SEQUENCE  "TEST"."SEQ001"  MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER  NOCYCLE  NOKEEP  NOSCALE  GLOBAL ;

-- YashanDB
CREATE SEQUENCE "TEST"."SEQ001" START WITH 1 INCREMENT BY 1 MAXVALUE 9999999999999999999999999999 MINVALUE 1 NOCYCLE CACHE 20 NOORDER;

-- 注意:移除NOKEEP  NOSCALE  GLOBAL