3.3.4. DDL

3.3.4.1. GaussDB-Oracle

3.3.4.1.1. 创建库

语法

CREATE DATABASE [IF NOT EXISTS] DB_NAME

警告

可通过参数unisql.change.database.to.schema配置来决定通过统一SQL转换后逻辑:

当unisql.change.database.to.schema=1时,统一SQL转换为创建模式;CREATE SCHEMA schema_name;

当unisql.change.database.to.schema=0时,统一SQL转换为创建库;CREATE DATABASE db_name;

示例

-- 转换前MySQL SQL:
CREATE DATABASE IF NOT EXISTS testdb;

-- 统一SQL配置unisql.change.database.to.schema=1,转换后GaussDB-Oracle SQL:
CREATE SCHEMA testdb;

-- 统一SQL配置unisql.change.database.to.schema=0,转换后GaussDB-Oracle SQL:
CREATE DATABASE testdb;

3.3.4.1.2. 删除库

语法

DROP DATABASE [IF EXISTS] DB_NAME

警告

可通过参数unisql.change.database.to.schema配置决定统一SQL转换后对象为DATABASE或SCHEMA:

当unisql.change.database.to.schema=1时,统一SQL转换为删除模式;DROP SCHEMA [IF EXISTS] schema_name CASCADE;

当unisql.change.database.to.schema=0时,统一SQL转换为删除库;DROP DATABASE [IF EXISTS] db_name;

unisql.change.database.to.schema参数值默认为0。

示例

-- 转换前MySQL SQL:
DROP DATABASE IF EXISTS testdb;

-- 统一SQL配置unisql.change.database.to.schema=1,转换后GaussDB-Oracle SQL:
DROP SCHEMA IF EXISTS testdb CASCADE;

-- 统一SQL配置unisql.change.database.to.schema=0,转换后GaussDB-Oracle SQL:
DROP DATABASE IF EXISTS testdb;

3.3.4.1.3. 切换库

语法

USE DB_NAME

警告

DB_NAME 不能为mysql或GaussDB-Oracle关键字,否则在执行过程中报错。

示例

-- 转换前MySQL SQL:
   USE DB_NAME

-- 转换后GaussDB-Oracle SQL:
   SET SCHEMA 'DB_NAME'

3.3.4.1.4. 创建普通表

语法

CREATE TABLE [IF NOT EXISTS] TABLE_NAME(
    COLUMN_NAME1 DATATYPE [AUTO_INCREMENT] [DEFAULT ...] [ON UPDATE CURRENT_TIMESTAMP] [ZEROFILL]
    [CHARSET | CHARACTER SET CHARSET_NAME] [COLLATE COLLATION_NAME] [COMMENT COMMENT_STRING]
    [, ...]
    [, PRIMARY KEY(COLUMN_NAME [, ...] [USING BTREE])]
    [, INDEX INDEX_NAME(COLUMN_NAME [, ...] [USING BTREE])]
    [, FULLTEXT [KEY] [FULL_INDEX_NAME](COLUMN_NAME [, ...])]
)
[ENGINE = ENGINE_NAME]
[[DEFAULT] CHARSET | CHARACTER SET [=] CHARSET_NAME]
[[DEFAULT] COLLATE [=] COLLATION_NAME]
[ROW_FORMAT [=] FORMAT_NAME]
[COMMENT [=] COMMENT_STRING]
[DELAY_KEY_WRITE [=] {0|1}]
[CHECKSUM [=] {0|1}]

警告

对于CHARACTER/CHARACTER SET、COLLATE、ROW_FORMAT可选字段,统一SQL均为语法支持,无实际功能; 支持创建前缀索引语法,无实际功能;

对于表中列指定了自增主键,当向主键列中null值时,等同于default会自动生成自增主键值,例如:

– 转换前MySQL SQL(id为自增主键列): INSERT INTO t1(id, name) VALUES(NULL, ‘test’);

– 转换后GaussDB-Oracle SQL: INSERT INTO t1(id, name) VALUES(DEFAULT, ‘test’);

支持PRIMARY KEY、UNIQUE KEY、KEY、INDEX对象带备注,如对象没有指定名称则根据规则:表名_指定列(多个列间用下划线拼接)_后缀 生成对象名称, 说明:PRIMARY KEY后缀为 _pkey、UNIQUE KEY后缀为 _key、KEY和INDEX后缀为 _idx

FULLTEXT KEY转换为普通索引,转换后只支持普通索引,不支持全文索引功能,如果建表语句中fulltext key未指定索引名称,转换后会自动生成名称,名称格式为:tablename_columnname[_columnname]_idx。

一个表多个对象的名称超过63个字符,且前63个字符一致,因GAUSSDB_ORACLE会截取前63个字符作为对象名称,会导致后创建的对象失败,这种统一sql不做特殊处理;

GAUSSDB_ORACLE中相同名称的约束只能创建一个,不同表产生相同名称的约束对象统一sql不做特殊处理。

示例

-- 转换前MySQL SQL:
CREATE TABLE IF NOT EXISTS test_table(
    id int AUTO_INCREMENT,
    co1 varchar(20) DEFAULT 'abc' COMMENT 'this is a test column',
    co2 text CHARSET utf8 COLLATE utf8_general_ci NOT NULL,
    co3 timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    co4 numeric(5, 3) ZEROFILL,
    co5 varchar(200),
    PRIMARY KEY(id),
    INDEX idx_co12(co1, co2),
    KEY idx_co5(co5(50))
)
ENGINE=InnoDB
DEFAULT CHARACTER SET utf8
DEFAULT COLLATE=utf8_bin
ROW_FORMAT = COMPACT
COMMENT = 'this is test table';

-- 转换后GaussDB-Oracle SQL:
CREATE TABLE IF NOT EXISTS test_table (
    id serial,
    co1 nvarchar2(20) DEFAULT 'abc' ,
    co2 text NOT NULL,
    co3 timestamp DEFAULT CURRENT_TIMESTAMP(0),
    co4 numeric(5,3),
    PRIMARY KEY(id)
) ;

COMMENT ON TABLE test_table IS 'this is test table';
COMMENT ON COLUMN test_table.co1 IS 'this is a test column';
CREATE INDEX idx_co12 ON test_table(co1,co2);
CREATE INDEX idx_co5 ON test_table(co5);


-- 转换前MySQL SQL:
CREATE TABLE EXAMPLE_TABLE (
    COLUMN1 INT AUTO_INCREMENT COMMENT 'COLUMN1',
    COLUMN2 VARCHAR ( 255 ) NOT NULL COMMENT 'COLUMN2',
    COLUMN3 VARCHAR ( 50 ) NOT NULL COMMENT 'COLUMN3',
    COLUMN4 INT COMMENT 'COLUMN4',
    COLUMN5 INT COMMENT 'COLUMN5',
    COLUMN6 INT COMMENT 'COLUMN6',
    COLUMN7 INT COMMENT 'COLUMN7',
    COLUMN8 INT COMMENT 'COLUMN8',
    COLUMN9 INT COMMENT 'COLUMN9',
    COLUMN10 INT COMMENT 'COLUMN10',
    PRIMARY KEY ( COLUMN1 ) COMMENT '主键 ',
    UNIQUE KEY ( COLUMN2, COLUMN3, COLUMN4 ) COMMENT '唯一索引',
    KEY ( COLUMN5 ) COMMENT 'KEY',
INDEX ( COLUMN6, COLUMN7, COLUMN8, COLUMN9, COLUMN10 ) COMMENT '索引'
) COMMENT = '用户信息表';

-- 转换后GaussDB-Oracle SQL:
CREATE TABLE EXAMPLE_TABLE (
    COLUMN1 serial,
    COLUMN2 nvarchar2 ( 765 ) NOT NULL,
    COLUMN3 nvarchar2 ( 150 ) NOT NULL,
    COLUMN4 INT,
    COLUMN5 INT,
    COLUMN6 INT,
    COLUMN7 INT,
    COLUMN8 INT,
    COLUMN9 INT,
    COLUMN10 INT,
    CONSTRAINT example_table_pkey PRIMARY KEY ( COLUMN1 ),
CONSTRAINT example_table_column2_column3_column4_key UNIQUE ( COLUMN2, COLUMN3, COLUMN4 ));
CREATE INDEX example_table_column5_idx ON EXAMPLE_TABLE ( COLUMN5 );
CREATE INDEX example_table_column6_column7_column8_column9_column10_idx ON EXAMPLE_TABLE ( COLUMN6, COLUMN7, COLUMN8, COLUMN9, COLUMN10 );
COMMENT ON TABLE EXAMPLE_TABLE IS '用户信息表';
COMMENT ON COLUMN EXAMPLE_TABLE.COLUMN1 IS 'COLUMN1';
COMMENT ON COLUMN EXAMPLE_TABLE.COLUMN2 IS 'COLUMN2';
COMMENT ON COLUMN EXAMPLE_TABLE.COLUMN3 IS 'COLUMN3';
COMMENT ON COLUMN EXAMPLE_TABLE.COLUMN4 IS 'COLUMN4';
COMMENT ON COLUMN EXAMPLE_TABLE.COLUMN5 IS 'COLUMN5';
COMMENT ON COLUMN EXAMPLE_TABLE.COLUMN6 IS 'COLUMN6';
COMMENT ON COLUMN EXAMPLE_TABLE.COLUMN7 IS 'COLUMN7';
COMMENT ON COLUMN EXAMPLE_TABLE.COLUMN8 IS 'COLUMN8';
COMMENT ON COLUMN EXAMPLE_TABLE.COLUMN9 IS 'COLUMN9';
COMMENT ON COLUMN EXAMPLE_TABLE.COLUMN10 IS 'COLUMN10';
COMMENT ON CONSTRAINT example_table_pkey ON EXAMPLE_TABLE IS '主键 ';
COMMENT ON CONSTRAINT example_table_column2_column3_column4_key ON EXAMPLE_TABLE IS '唯一索引';
COMMENT ON INDEX example_table_column5_idx IS 'KEY';
COMMENT ON INDEX example_table_column6_column7_column8_column9_column10_idx IS '索引'

-- 转换前MySQL SQL:
create table GROUPS (
    id int,
    name varchar(100),
    name_desc varchar(100),
    trans_name varchar(100),
    test_values varchar(100),
    values1 varchar(100),
    GROUPS int
);

-- 转换后GaussDB-Oracle SQL:
create table GROUPS (id int,
    name nvarchar2(300),
    name_desc nvarchar2(300),
    trans_name nvarchar2(300),
    test_values nvarchar2(300),
    values1 nvarchar2(300),
    GROUPS int
)

-- 转换前MySQL SQL:
CREATE TABLE unisql_delay_key_write_check (
    employee_id INT NOT NULL AUTO_INCREMENT,
    employee_name VARCHAR(255),
    department VARCHAR(100),
    PRIMARY KEY (employee_id)
) DELAY_KEY_WRITE=1 CHECKSUM=0

-- 转换后GaussDB-Oracle SQL:
CREATE TABLE unisql_delay_key_write_check (
    employee_id serial NOT NULL,
    employee_name nvarchar2(765),
    department nvarchar2(300),
    CONSTRAINT unisql_delay_key_write_check_pkey PRIMARY KEY(employee_id))

3.3.4.1.5. 修改普通表

语法

ALTER TABLE [IF EXISTS] TABLE_NAME
[DROP PRIMARY KEY | INDEX INDEX_NAME]
| ADD [COLUMN] [IF NOT EXISTS] COLUMN_NAME DATATYPE [CHARACTER SET CHARSET_NAME] [COLLATE COLLATE_NAME] [DEFAULT ...] [COMMENT COMMENT_STRING]
| MODIFY [COLUMN] COLUMN_NAME DATATYPE [CHARACTER SET CHARSET_NAME] [COLLATE COLLATE_NAME] [DEFAULT ...] [COMMENT COMMENT_STRING]
| CHANGE [COLUMN] COLUMN_OLD_NAME COLUMN_NEW_NAME DATATYPE [CHARACTER SET CHARSET_NAME] [COLLATE COLLATE_NAME] [DEFAULT ...] [COMMENT COMMENT_STRING]
| ADD INDEX | KEY INDEX_NAME(COLUMN_NAME [, ...])
| RENAME INDEX | KEY INDEX_OLD_NAME TO INDEX_NEW_NAME
| CONVERT TO CHARACTER SET CHARSET_NAME
| COMMENT COMMENT_STRING

警告

  • ALTER TABLE…CONVERT TO CHARACTER SET…仅语法支持,无实际功能,且受配置参数控制,config/unisql.conf中unisql.replace.sql参数可配置需要替换的sql语句。

  • ALTER TABLE TABLE_NAME change 中 DATATYPE 为 double(p,s) 时转换为decimal(p,s),p、s参考数据类型章节; (numeric和decimal是等价的)。

  • ALTER TABLE TABLE_NAME change 中 DATATYPE 为 datetime 时转换为timestamp(0);(mysql datetime对应无精度的timestamp)。

  • ALTER TABLE TABLE_NAME MODIFY|CHANGE 在 GaussDB 中修改类型需要有类型转换逻辑,不是所有类型都支持转换,类型是否可以修改,需要遵循 GaussDB 的约束规则,比如blob类型修改成int不支持。

  • ALTER TABLE TABLE_NAME ADD 的IF NOT EXISTS 转化到GaussDB-Oracle后被忽略,所以添加表中已经存在的列,在GaussDB-Oracle执行会报错。

  • ALTER TABLE IF EXISTS TABLE_NAME 后仅支持 DROP PRIMARY KEY 、ADD [COLUMN] xxx、MODIFY [COLUMN] xxx、CHANGE [COLUMN] xxx 语法。

示例

-- 转换前MySQL SQL:
ALTER TABLE test_table DROP PRIMARY KEY;
ALTER TABLE test_table DROP INDEX idx_co12;
ALTER TABLE test_table ADD COLUMN IF NOT EXISTS co5 VARCHAR(20) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT 'this is a comment';
ALTER TABLE test_table MODIFY COLUMN co5 text CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT 'test column' COMMENT 'this is another comment';
ALTER TABLE test_table CHANGE COLUMN co5 co5_new blob DEFAULT NULL COMMENT 'this is a new comment';
ALTER TABLE test_table ADD INDEX idx_co5(co5);
ALTER TABLE test_table ADD KEY idx_co5_another(co5);
ALTER TABLE test_table RENAME INDEX idx_co5 TO idx_co5_new;
ALTER TABLE test_table CONVERT TO CHARACTER SET utf8;
ALTER TABLE test_table COMMENT 'this is a new table comment';
ALTER TABLE test_table ADD COLUMN mediumintColumn mediumint DEFAULT 0 ;

-- 转换后GaussDB-Oracle SQL:
ALTER TABLE test_table DROP CONSTRAINT test_table_pkey;
DROP INDEX idx_co12;

ALTER TABLE test_table ADD co5 nvarchar2(20) DEFAULT NULL;
COMMENT ON COLUMN test_table.co5 IS 'this is a comment';

ALTER TABLE test_table ALTER COLUMN co5 TYPE text;
ALTER TABLE test_table ALTER COLUMN co5 SET DEFAULT 'test column';
COMMENT ON COLUMN test_table.co5 IS 'this is another comment';

ALTER TABLE test_table RENAME co5 TO co5_new;
ALTER TABLE test_table ALTER COLUMN co5_new TYPE bytea;
ALTER TABLE test_table ALTER COLUMN co5_new SET DEFAULT NULL;
COMMENT ON COLUMN test_table.co5_new IS 'this is a new comment';

CREATE INDEX idx_co5 ON test_table (co5);

CREATE INDEX idx_co5_another ON test_table (co5);

ALTER INDEX idx_co5 RENAME TO idx_co5_new;

-- unisql.replace.sql = 'select 1'
select 1;

COMMENT ON TABLE test_table IS 'this is a new table comment';

ALTER TABLE unisql_mediumint_test ADD mediumintColumn int DEFAULT 0;

-- 转换前MySQL SQL:
ALTER TABLE if exists unisql_table_alter_table DROP PRIMARY KEY;
ALTER TABLE if exists unisql_table_alter_table ADD COLUMN IF NOT EXISTS co6 VARCHAR(20) CHARACTER SET utf8 COLLATE  utf8_general_ci DEFAULT NULL COMMENT 'this is a comment';
ALTER TABLE if exists unisql_table_alter_table MODIFY COLUMN co5 text CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT 'test column' COMMENT 'this is another comment';
ALTER TABLE if exists unisql_table_alter_table CHANGE COLUMN co5 co51 text DEFAULT NULL COMMENT 'this is a new comment';

-- 转换后GaussDB-Oracle SQL:
ALTER TABLE IF EXISTS unisql_table_alter_table DROP CONSTRAINT unisql_table_alter_table_pkey;

ALTER TABLE IF EXISTS unisql_table_alter_table ADD co6 nvarchar2(60) DEFAULT NULL;
COMMENT ON COLUMN unisql_table_alter_table.co6 IS 'this is a comment';

ALTER TABLE IF EXISTS unisql_table_alter_table ALTER COLUMN co5 TYPE text;
ALTER TABLE IF EXISTS unisql_table_alter_table ALTER COLUMN co5 SET DEFAULT 'test column';
COMMENT ON COLUMN unisql_table_alter_table.co5 IS 'this is another comment';

ALTER TABLE IF EXISTS unisql_table_alter_table RENAME co5 TO co51;
ALTER TABLE IF EXISTS unisql_table_alter_table ALTER COLUMN co51 TYPE text;
ALTER TABLE IF EXISTS unisql_table_alter_table ALTER COLUMN co51 SET DEFAULT NULL;
COMMENT ON COLUMN unisql_table_alter_table.co51 IS 'this is a new comment';

3.3.4.1.6. 创建分区表

语法

CREATE TABLE [IF NOT EXISTS] TABLE_NAME(
    COLUMN_NAME1 DATATYPE [AUTO_INCREMENT] [DEFAULT ...] [ON UPDATE CURRENT_TIMESTAMP] [ZEROFILL]
    [COLLATE COLLATION_NAME] [COMMENT COMMENT_STRING]
    [, ...]
    [, PRIMARY KEY(COLUMN_NAME [, ...] [USING BTREE])]
    [, INDEX INDEX_NAME(COLUMN_NAME [, ...] [USING BTREE])]
)
PARTITION BY RANGE [COLUMNS](COLUMN_NAME)(
    PARTITION PARTITION_NAME VALUES LESS THAN (VALUE_1)
    [, ...]
)

示例

-- 转换前MySQL SQL:
CREATE TABLE IF NOT EXISTS test_table_partition(
        id int AUTO_INCREMENT,
        co1 varchar(20) DEFAULT 'abc' COMMENT 'this is a test column',
        co2 text NOT NULL COLLATE 'utf8_bin',
        co3 timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
        co4 numeric(5, 3) ZEROFILL,
        PRIMARY KEY(id),
        INDEX idx_co12(co1)
    )
    PARTITION BY RANGE COLUMNS(id)
    (
        PARTITION p0 VALUES LESS THAN (100),
        PARTITION p1 VALUES LESS THAN (200),
        PARTITION p2 VALUES LESS THAN (300)
    );

-- 转换后GaussDB-Oracle SQL:
CREATE TABLE IF NOT EXISTS test_table_partition (
    id serial,
    co1 nvarchar2(60) DEFAULT 'abc' ,
    co2 text NOT NULL,
    co3 timestamp DEFAULT CURRENT_TIMESTAMP(0),
    co4 numeric(5,3),
    CONSTRAINT test_table_partition_pkey PRIMARY KEY(id)
    ) PARTITION BY RANGE (id) (
        PARTITION  p0 VALUES LESS THAN (100),
        PARTITION  p1 VALUES LESS THAN (200),
        PARTITION  p2 VALUES LESS THAN (300)
    );
CREATE INDEX idx_co12 ON test_table_partition (co1);
COMMENT ON COLUMN test_table_partition.co1 IS 'this is a test column';

3.3.4.1.7. 创建用户

语法

CREATE USER USER_NAME@HOST_NAME IDENTIFIED BY PASSWORD

示例

-- 转换前MySQL SQL:
CREATE USER 'user1'@'localhost' IDENTIFIED BY '123456';

-- 转换后GaussDB-Oracle SQL:
CREATE USER "user1" IDENTIFIED BY '123456';

3.3.4.1.8. 修改用户

语法

ALTER USER USER_NAME@HOST_NAME
[IDENTIFIED BY NEW_PASSWORD]
| [ACCOUNT LOCK | UNLOCK]

示例

-- 转换前MySQL SQL:
ALTER USER 'user1'@'localhost' IDENTIFIED BY 'abc567890';
ALTER USER 'user1'@'localhost' ACCOUNT LOCK;
ALTER USER 'user1'@'localhost' ACCOUNT UNLOCK;

-- 转换后GaussDB-Oracle SQL:
ALTER USER "user1" IDENTIFIED BY 'abc567890';
ALTER USER "user1" ACCOUNT LOCK;
ALTER USER "user1" ACCOUNT UNLOCK;

3.3.4.1.9. 设置外键约束

语法

SET FOREIGN_KEY_CHECKS = {0 | 1}

警告

其中 0 表示禁用外键约束,1 表示启用外键约束

示例

-- 转换前MySQL SQL:
SET FOREIGN_KEY_CHECKS = 0;
SET FOREIGN_KEY_CHECKS = 1;

-- 转换后GaussDB-Oracle SQL:
seelct 1;

3.3.4.1.10. 修改自增列的起始值

语法

ALTER TABLE table_name AUTO_INCREMENT = number

警告

修改自增列的起始值目前限制:
  • 依赖unisql.conf文件中配置unisql.auto.increment.column的相关内容;

  • GaussDB-Oracle默认的序列名称为:表名_列名_seq,本次转化使用GaussDB-Oracle默认的序列名称,用户需要保证模式下序列名称唯一;

  • MySQL的修改自增列的起始值是DDL语句,转化后变成DQL语句;

  • 对于MySQL的Bigint类型自增列,转化到GaussDB-Oracle后类型为Bigserial,所以起始值范围:1到2^63 - 1;MySQL的其他整形类型,转化到GaussDB-Oracle后类型为serial,所以起始值范围:1到2^31 - 1。

示例

CREATE TABLE test_table_auto_increment (
    id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(50),
    PRIMARY KEY (id)
) ENGINE=InnoDB;

-- 转换前MySQL SQL:
ALTER TABLE test_table_auto_increment AUTO_INCREMENT = 100;

-- 转换后GaussDB-Oracle SQL:
SELECT setval('test_table_auto_increment_id_seq', 100, FALSE)

3.3.4.1.11. 优化存储空间

语法

OPTIMIZE [NO_WRITE_TO_BINLOG | LOCAL]
TABLE TABLE_NAME [, TABLE_NAME] ...

警告

GaussDB-Oracle(V500)不支持OPTIMIZE TABLE语法,对应的语法为 VACUUM TABLE_NAME 且VACUUM只支持单表。

示例

--转化前转换前MySQL SQL:
OPTIMIZE LOCAL TABLE  students,courses;
OPTIMIZE NO_WRITE_TO_BINLOG TABLE  students,courses,enrollments;

--转化后GaussDB-Oracle SQL:
VACUUM students; VACUUM courses;
VACUUM students; VACUUM courses; VACUUM enrollments;

3.3.4.1.12. 删除表主键约束并创建新的主键约束

语法

ALTER TABLE TABLE_NAME DROP PRIMARY KEY, ADD PRIMARY KEY(COLUMN_NAME[,COLUMN_NAME]);

警告

GaussDB-Oracle(V500)不支持上述语法,需要拆分为两句sql并使用begin…end语句块将这两句sql作为整体执行。

删除的主键约束名称和新创建的主键约束名称使用GaussDB-Oracle(V500)默认的命名格式:table_name_pkey。

示例

--转化前转换前MySQL SQL:
ALTER TABLE parent_table DROP PRIMARY KEY, add PRIMARY KEY(parent_id);

--转化后GaussDB-Oracle SQL:
begin
ALTER TABLE parent_table DROP CONSTRAINT parent_table_pkey;
ALTER TABLE parent_table ADD CONSTRAINT parent_table_pkey PRIMARY KEY(parent_id);
end;

3.3.4.2. Oracle_19C

3.3.4.2.1. 创建普通表

语法

CREATE TABLE [IF NOT EXISTS] TABLE_NAME(
    COLUMN_NAME1 DATATYPE [AUTO_INCREMENT] [DEFAULT ...] [ON UPDATE CURRENT_TIMESTAMP] [ZEROFILL]
    [CHARSET | CHARACTER SET CHARSET_NAME] [COLLATE COLLATION_NAME] [COMMENT COMMENT_STRING]
    [, ...]
    [, PRIMARY KEY(COLUMN_NAME [, ...] [USING BTREE])]
    [, INDEX INDEX_NAME(COLUMN_NAME [, ...] [USING BTREE])]
    [, FULLTEXT [KEY] [FULL_INDEX_NAME](COLUMN_NAME [, ...])]
)
[ENGINE = ENGINE_NAME]
[[DEFAULT] CHARSET | CHARACTER SET [=] CHARSET_NAME]
[[DEFAULT] COLLATE [=] COLLATION_NAME]
[ROW_FORMAT [=] FORMAT_NAME]
[COMMENT [=] COMMENT_STRING]
[DELAY_KEY_WRITE [=] {0|1}]
[CHECKSUM [=] {0|1}]

警告

对于CHARACTER/CHARACTER SET、COLLATE、ROW_FORMAT、ENGINE、DELAY_KEY_WRITE、CHECKSUM可选字段,统一SQL均为语法支持,无实际功能; 支持创建前缀索引语法,无实际功能;

支持PRIMARY KEY、UNIQUE KEY、KEY、INDEX对象带备注,如对象没有指定名称则根据规则:表名_指定列(多个列间用下划线拼接)_后缀 生成对象名称, 说明:PRIMARY KEY后缀为 _pkey、UNIQUE KEY后缀为 _key、KEY和INDEX后缀为 _idx

FULLTEXT KEY转换为普通索引,转换后只支持普通索引,不支持全文索引功能,如果建表语句中fulltext key未指定索引名称,转换后会自动生成名称,名称格式为:tablename_columnname[_columnname]_idx。

不支持在text类型上建立索引;

不支持多个字段使用AUTO_INCREMENT属性;

如果字段类型是DATATIME/TIMESTAMP, 则DEFAULT 值不支持时间格式的字符串,如 DEFAULT ‘2023-01-01 00:00:00’;

oracle不支持约束和索引的注释,统一SQL转换后忽略了约束和索引上的注释;

不支持在double类型字段上使用AUTO_INCREMENT属性;

不支持针对单独某个列建多个索引;

示例

-- 转换前MySQL SQL:
CREATE TABLE IF NOT EXISTS test_table_123 (
    id int AUTO_INCREMENT,
    co1 varchar(20) DEFAULT 'abc' COMMENT 'this is a test column',
    co2 text CHARSET utf8 COLLATE utf8_general_ci NOT NULL,
    co3 timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    co4 numeric(5, 3) ZEROFILL,
    co5 varchar(200) CHARACTER SET utf8,
    co6 varchar(20),
    PRIMARY KEY(id) USING BTREE,
    INDEX idx_co12(co1) USING BTREE,
    KEY idx_co5(co5),
    FULLTEXT idx_fulltex_co2(co6)
)
ENGINE=InnoDB
DEFAULT CHARACTER SET utf8
DEFAULT COLLATE=utf8_bin
ROW_FORMAT=COMPACT
COMMENT = 'this is test table';

-- 转换后Oracle_19C SQL:
CREATE TABLE test_table_123 (
    id int GENERATED BY DEFAULT AS IDENTITY,
    co1 varchar2(60) DEFAULT 'abc' ,
    co2 clob NOT NULL,
    co3 timestamp DEFAULT CURRENT_TIMESTAMP(0),
    co4 numeric(5,3),
    co5 varchar2(600),
    co6 varchar2(60),
    CONSTRAINT test_table_123_pkey PRIMARY KEY(id)
);
CREATE INDEX idx_co12 ON test_table_123 (co1);
CREATE INDEX idx_co5 ON test_table_123 (co5);
CREATE INDEX idx_fulltex_co2 ON test_table_123 (co6);
COMMENT ON TABLE test_table_123 IS 'this is test table';
COMMENT ON COLUMN test_table_123.co1 IS 'this is a test column';


-- 转换前MySQL SQL:
CREATE TABLE EXAMPLE_TABLE (
    COLUMN1 INT AUTO_INCREMENT COMMENT 'COLUMN1',
    COLUMN2 VARCHAR ( 255 ) NOT NULL COMMENT 'COLUMN2',
    COLUMN3 VARCHAR ( 50 ) NOT NULL COMMENT 'COLUMN3',
    COLUMN4 INT COMMENT 'COLUMN4',
    COLUMN5 INT COMMENT 'COLUMN5',
    COLUMN6 INT COMMENT 'COLUMN6',
    COLUMN7 INT COMMENT 'COLUMN7',
    COLUMN8 INT COMMENT 'COLUMN8',
    COLUMN9 INT COMMENT 'COLUMN9',
    COLUMN10 INT COMMENT 'COLUMN10',
    PRIMARY KEY ( COLUMN1 ) COMMENT '主键 ',
    UNIQUE KEY ( COLUMN2, COLUMN3, COLUMN4 ) COMMENT '唯一索引',
    KEY ( COLUMN5 ) COMMENT 'KEY',
    INDEX ( COLUMN6, COLUMN7, COLUMN8, COLUMN9, COLUMN10 ) COMMENT '索引'
) COMMENT = '用户信息表';

-- 转换后Oracle_19C SQL:
CREATE TABLE EXAMPLE_TABLE (
    COLUMN1 int GENERATED BY DEFAULT AS IDENTITY ,
    COLUMN2 varchar2(765)  NOT NULL,
    COLUMN3 varchar2(150)  NOT NULL,
    COLUMN4 int ,
    COLUMN5 int ,
    COLUMN6 int ,
    COLUMN7 int ,
    COLUMN8 int ,
    COLUMN9 int ,
    COLUMN10 int ,
    CONSTRAINT example_table_pkey PRIMARY KEY(COLUMN1),
    CONSTRAINT example_table_column2_column3_column4_key UNIQUE(COLUMN2, COLUMN3, COLUMN4)
);
CREATE INDEX example_table_column5_idx ON EXAMPLE_TABLE (COLUMN5);
CREATE INDEX example_table_column6_column7_column8_column9_column10_idx ON EXAMPLE_TABLE (COLUMN6, COLUMN7, COLUMN8, COLUMN9, COLUMN10);
COMMENT ON TABLE EXAMPLE_TABLE IS '用户信息表';
COMMENT ON COLUMN EXAMPLE_TABLE.COLUMN1 IS 'COLUMN1';
COMMENT ON COLUMN EXAMPLE_TABLE.COLUMN2 IS 'COLUMN2';
COMMENT ON COLUMN EXAMPLE_TABLE.COLUMN3 IS 'COLUMN3';
COMMENT ON COLUMN EXAMPLE_TABLE.COLUMN4 IS 'COLUMN4';
COMMENT ON COLUMN EXAMPLE_TABLE.COLUMN5 IS 'COLUMN5';
COMMENT ON COLUMN EXAMPLE_TABLE.COLUMN6 IS 'COLUMN6';
COMMENT ON COLUMN EXAMPLE_TABLE.COLUMN7 IS 'COLUMN7';
COMMENT ON COLUMN EXAMPLE_TABLE.COLUMN8 IS 'COLUMN8';
COMMENT ON COLUMN EXAMPLE_TABLE.COLUMN9 IS 'COLUMN9';
COMMENT ON COLUMN EXAMPLE_TABLE.COLUMN10 IS 'COLUMN10';

3.3.4.2.2. 修改普通表

语法

ALTER TABLE TABLE_NAME
[DROP PRIMARY KEY | INDEX INDEX_NAME]
| ADD [COLUMN] [IF NOT EXISTS] COLUMN_NAME DATATYPE [CHARACTER SET CHARSET_NAME] [COLLATE COLLATE_NAME] [DEFAULT ...] [COMMENT COMMENT_STRING]
| MODIFY [COLUMN] COLUMN_NAME DATATYPE [CHARACTER SET CHARSET_NAME] [COLLATE COLLATE_NAME] [DEFAULT ...] [COMMENT COMMENT_STRING]
| CHANGE [COLUMN] COLUMN_OLD_NAME COLUMN_NEW_NAME DATATYPE [CHARACTER SET CHARSET_NAME] [COLLATE COLLATE_NAME] [DEFAULT ...] [COMMENT COMMENT_STRING]
| ADD INDEX | KEY INDEX_NAME(COLUMN_NAME [, ...])
| RENAME INDEX | KEY INDEX_OLD_NAME TO INDEX_NEW_NAME
| CONVERT TO CHARACTER SET CHARSET_NAME
| COMMENT COMMENT_STRING

警告

  • ALTER TABLE…CONVERT TO CHARACTER SET…仅语法支持,无实际功能,且受配置参数控制,config/unisql.conf中unisql.replace.sql参数可配置需要替换的sql语句。

  • ALTER TABLE TABLE_NAME change 中 DATATYPE 为 double(p,s) 时转换为decimal(p,s),p、s参考数据类型章节; (numeric和decimal是等价的)。

  • ALTER TABLE TABLE_NAME change 中 DATATYPE 为 datetime 时转换为timestamp(0);(mysql datetime对应无精度的timestamp)。

  • ALTER TABLE TABLE_NAME MODIFY|CHANGE 在 Oracle_19C 中修改类型需要有类型转换逻辑,不是所有类型都支持转换,类型是否可以修改,需要遵循 Oracle_19C 的约束规则,比如blob类型修改成int不支持。

  • ALTER TABLE TABLE_NAME ADD 的IF NOT EXISTS 转化到Oracle_19C后被忽略,所以添加表中已经存在的列,在Oracle_19C执行会报错。

  • ALTER TABLE IF EXISTS TABLE_NAME MySQL 不支持该语法,在转换的时候报错。

  • ALTER TABLE 暂时支持一次修改一个属性,不支持使用逗号连接两个属性。

  • ALTER TABLE 表名、列名是关键字,使用反单引号引起来时,会转换成双引号。

  • ALTER TABLE DEFAULT 布尔类型 false 和 true 分别会被转换成 0 和 1; DEFAULT 表达式用双引号引起的,会转换成单引号引起来。

  • ALTER TABLE TABLE_NAME DROP INDEX INDEX_NAME 会被转换成 DROP INDEX INDEX_NAME。

  • ALTER TABLE TABLE_NAME DROP PRIMARY KEY 转换语句不改变。

  • ALTER TABLE TABLE_NAME 转换涉及类型,按照 MySQL 转 Oracle_19C 的逻辑。

  • ALTER TABLE TABLE_NAME CHARACTER SET 字符集设置,COLLATE 排序规则设置转换时会忽略。

  • ALTER TABLE TABLE_NAM ADD INDEX 会直接转换成 CREATE INDEX 语句。

  • 如果字段类型是DATATIME/TIMESTAMP, 则DEFAULT 值不支持时间格式的字符串,如 DEFAULT ‘2023-01-01 00:00:00’。

示例

-- 转换前MySQL SQL:
ALTER TABLE test_table DROP PRIMARY KEY;
ALTER TABLE test_table DROP INDEX idx_co12;
ALTER TABLE test_table ADD COLUMN IF NOT EXISTS co5 VARCHAR(20) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT 'this is a comment';
ALTER TABLE test_table MODIFY COLUMN co5 text CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT 'test column' COMMENT 'this is another comment';
ALTER TABLE test_table CHANGE COLUMN co5 co5_new blob DEFAULT NULL COMMENT 'this is a new comment';
ALTER TABLE test_table ADD INDEX idx_co5(co5);
ALTER TABLE test_table ADD KEY idx_co5_another(co5);
ALTER TABLE test_table RENAME INDEX idx_co5 TO idx_co5_new;
ALTER TABLE test_table CONVERT TO CHARACTER SET utf8;
ALTER TABLE test_table COMMENT 'this is a new table comment';
ALTER TABLE test_table ADD COLUMN mediumintColumn mediumint DEFAULT 0 ;
ALTER TABLE employees ADD COLUMN nickname VARCHAR(50) DEFAULT "none";
ALTER TABLE employees ADD is_admin number(1,0) DEFAULT FALSE;

-- 转换后Oracle_19C SQL:
ALTER TABLE test_table DROP PRIMARY KEY;
DROP INDEX idx_co12;

ALTER TABLE test_table ADD co5 varchar2(20) DEFAULT NULL;
COMMENT ON COLUMN test_table.co5 IS 'this is a comment';

ALTER TABLE test_table ALTER COLUMN co5 text;
ALTER TABLE test_table ALTER COLUMN co5 DEFAULT 'test column';
COMMENT ON COLUMN test_table.co5 IS 'this is another comment';

ALTER TABLE test_table RENAME co5 TO co5_new;
ALTER TABLE test_table ALTER COLUMN co5_new bytea;
ALTER TABLE test_table ALTER COLUMN co5_new DEFAULT NULL;
COMMENT ON COLUMN test_table.co5_new IS 'this is a new comment';

CREATE INDEX idx_co5 ON test_table (co5);

CREATE INDEX idx_co5_another ON test_table (co5);

ALTER INDEX idx_co5 RENAME TO idx_co5_new;

-- unisql.replace.sql = 'select 1'
select 1;

COMMENT ON TABLE test_table IS 'this is a new table comment';

ALTER TABLE unisql_mediumint_test ADD mediumintColumn int DEFAULT 0;

3.3.4.2.3. 删除表

语法

DROP TABLE TABLE_NAME

示例

-- 转换前MySQL SQL:
DROP TABLE test_table;

-- 转换后Oracle_19C SQL:
DROP TABLE test_table;

3.3.4.2.4. 拷贝表结构

语法

CREATE TABLE [IF NOT EXISTS] TABLE_NAME LIKE TABLE_NAME

警告

  • Oracle_19C 不支持 IF NOT EXISTS,IF NOT EXISTS为语法糖会被直接删除

  • 只拷贝表结构,表的约束,索引,自增序列,注释,主键,字符集不能拷贝

  • 表名不支持大小写敏感,特殊字符,反引号大小写敏感

示例

-- 转换前MySQL SQL:
CREATE TABLE new_tbl LIKE orig_tbl;

-- 转换后Oracle_19C SQL:
CREATE TABLE new_tbl AS SELECT * FROM orig_tbl WHERE 1= 0;

3.3.4.3. OceanBase-Oracle

3.3.4.3.1. 创建普通表

语法

CREATE TABLE [IF NOT EXISTS] TABLE_NAME(
    COLUMN_NAME1 DATATYPE [AUTO_INCREMENT] [DEFAULT ...] [ON UPDATE CURRENT_TIMESTAMP] [ZEROFILL]
    [CHARSET | CHARACTER SET CHARSET_NAME] [COLLATE COLLATION_NAME] [COMMENT COMMENT_STRING]
    [, ...]
    [, PRIMARY KEY(COLUMN_NAME [, ...] [USING BTREE])]
    [, INDEX INDEX_NAME(COLUMN_NAME [, ...] [USING BTREE])]
    [, FULLTEXT [KEY] [FULL_INDEX_NAME](COLUMN_NAME [, ...])]
)
[ENGINE = ENGINE_NAME]
[[DEFAULT] CHARSET | CHARACTER SET [=] CHARSET_NAME]
[[DEFAULT] COLLATE [=] COLLATION_NAME]
[ROW_FORMAT [=] FORMAT_NAME]
[COMMENT [=] COMMENT_STRING]
[DELAY_KEY_WRITE [=] {0|1}]
[CHECKSUM [=] {0|1}]

警告

对于CHARACTER/CHARACTER SET、COLLATE、ROW_FORMAT、ENGINE、DELAY_KEY_WRITE、CHECKSUM可选字段,统一SQL均为语法支持,无实际功能; 支持创建前缀索引语法,无实际功能;

支持PRIMARY KEY、UNIQUE KEY、KEY、INDEX对象带备注,如对象没有指定名称则根据规则:表名_指定列(多个列间用下划线拼接)_后缀 生成对象名称, 说明:PRIMARY KEY后缀为 _pkey、UNIQUE KEY后缀为 _key、KEY和INDEX后缀为 _idx

FULLTEXT KEY转换为普通索引,转换后只支持普通索引,不支持全文索引功能,如果建表语句中fulltext key未指定索引名称,转换后会自动生成名称,名称格式为:tablename_columnname[_columnname]_idx。

不支持在text类型上建立索引;

不支持多个字段使用AUTO_INCREMENT属性;

如果字段类型是DATATIME/TIMESTAMP, 则DEFAULT 值不支持时间格式的字符串,如 DEFAULT ‘2023-01-01 00:00:00’;

OceanBase-Oracle不支持约束和索引的注释,统一SQL转换后忽略了约束和索引上的注释;

不支持在double类型字段上使用AUTO_INCREMENT属性;

不支持针对单独某个列建多个索引;

示例

-- 转换前MySQL SQL:
CREATE TABLE IF NOT EXISTS test_table_123 (
    id int AUTO_INCREMENT,
    co1 varchar(20) DEFAULT 'abc' COMMENT 'this is a test column',
    co2 text CHARSET utf8 COLLATE utf8_general_ci NOT NULL,
    co3 timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    co4 numeric(5, 3) ZEROFILL,
    co5 varchar(200) CHARACTER SET utf8,
    co6 varchar(20),
    PRIMARY KEY(id) USING BTREE,
    INDEX idx_co12(co1) USING BTREE,
    KEY idx_co5(co5),
    FULLTEXT idx_fulltex_co2(co6)
)
ENGINE=InnoDB
DEFAULT CHARACTER SET utf8
DEFAULT COLLATE=utf8_bin
ROW_FORMAT=COMPACT
COMMENT = 'this is test table';

-- 转换后OceanBase-Oracle SQL:
CREATE TABLE test_table_123 (
    id int GENERATED BY DEFAULT AS IDENTITY,
    co1 varchar2(60) DEFAULT 'abc' ,
    co2 clob NOT NULL,
    co3 timestamp DEFAULT CURRENT_TIMESTAMP(0),
    co4 numeric(5,3),
    co5 varchar2(600),
    co6 varchar2(60),
    CONSTRAINT test_table_123_pkey PRIMARY KEY(id)
);
CREATE INDEX idx_co12 ON test_table_123 (co1);
CREATE INDEX idx_co5 ON test_table_123 (co5);
CREATE INDEX idx_fulltex_co2 ON test_table_123 (co6);
COMMENT ON TABLE test_table_123 IS 'this is test table';
COMMENT ON COLUMN test_table_123.co1 IS 'this is a test column';


-- 转换前MySQL SQL:
CREATE TABLE EXAMPLE_TABLE (
    COLUMN1 INT AUTO_INCREMENT COMMENT 'COLUMN1',
    COLUMN2 VARCHAR ( 255 ) NOT NULL COMMENT 'COLUMN2',
    COLUMN3 VARCHAR ( 50 ) NOT NULL COMMENT 'COLUMN3',
    COLUMN4 INT COMMENT 'COLUMN4',
    COLUMN5 INT COMMENT 'COLUMN5',
    COLUMN6 INT COMMENT 'COLUMN6',
    COLUMN7 INT COMMENT 'COLUMN7',
    COLUMN8 INT COMMENT 'COLUMN8',
    COLUMN9 INT COMMENT 'COLUMN9',
    COLUMN10 INT COMMENT 'COLUMN10',
    PRIMARY KEY ( COLUMN1 ) COMMENT '主键 ',
    UNIQUE KEY ( COLUMN2, COLUMN3, COLUMN4 ) COMMENT '唯一索引',
    KEY ( COLUMN5 ) COMMENT 'KEY',
    INDEX ( COLUMN6, COLUMN7, COLUMN8, COLUMN9, COLUMN10 ) COMMENT '索引'
) COMMENT = '用户信息表';

-- 转换后OceanBase-Oracle SQL:
CREATE TABLE EXAMPLE_TABLE (
    COLUMN1 int GENERATED BY DEFAULT AS IDENTITY ,
    COLUMN2 varchar2(765)  NOT NULL,
    COLUMN3 varchar2(150)  NOT NULL,
    COLUMN4 int ,
    COLUMN5 int ,
    COLUMN6 int ,
    COLUMN7 int ,
    COLUMN8 int ,
    COLUMN9 int ,
    COLUMN10 int ,
    CONSTRAINT example_table_pkey PRIMARY KEY(COLUMN1),
    CONSTRAINT example_table_column2_column3_column4_key UNIQUE(COLUMN2, COLUMN3, COLUMN4)
);
CREATE INDEX example_table_column5_idx ON EXAMPLE_TABLE (COLUMN5);
CREATE INDEX example_table_column6_column7_column8_column9_column10_idx ON EXAMPLE_TABLE (COLUMN6, COLUMN7, COLUMN8, COLUMN9, COLUMN10);
COMMENT ON TABLE EXAMPLE_TABLE IS '用户信息表';
COMMENT ON COLUMN EXAMPLE_TABLE.COLUMN1 IS 'COLUMN1';
COMMENT ON COLUMN EXAMPLE_TABLE.COLUMN2 IS 'COLUMN2';
COMMENT ON COLUMN EXAMPLE_TABLE.COLUMN3 IS 'COLUMN3';
COMMENT ON COLUMN EXAMPLE_TABLE.COLUMN4 IS 'COLUMN4';
COMMENT ON COLUMN EXAMPLE_TABLE.COLUMN5 IS 'COLUMN5';
COMMENT ON COLUMN EXAMPLE_TABLE.COLUMN6 IS 'COLUMN6';
COMMENT ON COLUMN EXAMPLE_TABLE.COLUMN7 IS 'COLUMN7';
COMMENT ON COLUMN EXAMPLE_TABLE.COLUMN8 IS 'COLUMN8';
COMMENT ON COLUMN EXAMPLE_TABLE.COLUMN9 IS 'COLUMN9';
COMMENT ON COLUMN EXAMPLE_TABLE.COLUMN10 IS 'COLUMN10';

3.3.4.3.2. 创建分区表

语法

CREATE TABLE [IF NOT EXISTS] TABLE_NAME(
    COLUMN_NAME1 DATATYPE [AUTO_INCREMENT] [DEFAULT ...] [ON UPDATE CURRENT_TIMESTAMP] [ZEROFILL]
    [COLLATE COLLATION_NAME] [COMMENT COMMENT_STRING]
    [, ...]
    [, PRIMARY KEY(COLUMN_NAME [, ...] [USING BTREE])]
    [, INDEX INDEX_NAME(COLUMN_NAME [, ...] [USING BTREE])]
)
PARTITION BY RANGE [COLUMNS](COLUMN_NAME)(
    PARTITION PARTITION_NAME VALUES LESS THAN (VALUE_1)
    [, ...]
)

警告

  • COLUMN_NAME支持的数据类型有int,tinyint,bigint,mediumint,date,datetime,char,varchar类型,其它数据类型不做处理

  • mysql数据库COLUMN_NAME支持函数,统一sql不支持

  • mysql数据库VALUE_1支持函数,统一sql不支持

  • mysql数据库COLUMN_NAME为date数据类型,VALUE_1支持字符串的格式大于统一SQL,统一sql只支持’YYYY-MM-DD’这种to_date函数可以使用的字符串

  • 分区表区分名称,分区列名称不支持大小写敏感,特殊字符,反引号大小写敏感

示例

-- 转换前MySQL SQL:
CREATE TABLE IF NOT EXISTS test_table_partition(
    id int,
    sale_date date
)
PARTITION BY RANGE COLUMNS(id, sale_date)
(
    PARTITION p0 VALUES LESS THAN (100, '2020-07-01'),
    PARTITION p1 VALUES LESS THAN (200, '2021-07-01'),
    PARTITION p2 VALUES LESS THAN (300, MAXVALUE)
);

-- 转换后OceanBase-Oracle SQL:
CREATE TABLE test_table_partition (
    id int,
    sale_date date
)
PARTITION BY RANGE (id,sale_date)
(
    PARTITION p0 VALUES LESS THAN (100, to_date('2020-07-01', 'YYYY-MM-DD')),
    PARTITION p1 VALUES LESS THAN (200, to_date('2021-07-01', 'YYYY-MM-DD')),
    PARTITION p2 VALUES LESS THAN (300, MAXVALUE)
);

3.3.4.3.3. 修改普通表

语法

ALTER TABLE TABLE_NAME
[DROP PRIMARY KEY | INDEX INDEX_NAME]
| ADD [COLUMN] [IF NOT EXISTS] COLUMN_NAME DATATYPE [CHARACTER SET CHARSET_NAME] [COLLATE COLLATE_NAME] [DEFAULT ...] [COMMENT COMMENT_STRING]
| MODIFY [COLUMN] COLUMN_NAME DATATYPE [CHARACTER SET CHARSET_NAME] [COLLATE COLLATE_NAME] [DEFAULT ...] [COMMENT COMMENT_STRING]
| CHANGE [COLUMN] COLUMN_OLD_NAME COLUMN_NEW_NAME DATATYPE [CHARACTER SET CHARSET_NAME] [COLLATE COLLATE_NAME] [DEFAULT ...] [COMMENT COMMENT_STRING]
| ADD INDEX | KEY INDEX_NAME(COLUMN_NAME [, ...])
| RENAME INDEX | KEY INDEX_OLD_NAME TO INDEX_NEW_NAME
| CONVERT TO CHARACTER SET CHARSET_NAME
| COMMENT COMMENT_STRING

警告

  • ALTER TABLE…CONVERT TO CHARACTER SET…仅语法支持,无实际功能,且受配置参数控制,config/unisql.conf中unisql.replace.sql参数可配置需要替换的sql语句。

  • ALTER TABLE TABLE_NAME change 中 DATATYPE 为 double(p,s) 时转换为decimal(p,s),p、s参考数据类型章节; (numeric和decimal是等价的)。

  • ALTER TABLE TABLE_NAME change 中 DATATYPE 为 datetime 时转换为timestamp(0);(mysql datetime对应无精度的timestamp)。

  • ALTER TABLE TABLE_NAME MODIFY|CHANGE 在 OceanBase-Oracle 中修改类型需要有类型转换逻辑,不是所有类型都支持转换,类型是否可以修改,需要遵循 OceanBase-Oracle 的约束规则,比如blob类型修改成int不支持。

  • ALTER TABLE TABLE_NAME ADD 的IF NOT EXISTS 转化到OceanBase-Oracle后被忽略,所以添加表中已经存在的列,在OceanBase-Oracle执行会报错。

  • ALTER TABLE IF EXISTS TABLE_NAME MySQL 不支持该语法,在转换的时候报错。

  • ALTER TABLE 暂时支持一次修改一个属性,不支持使用逗号连接两个属性。

  • ALTER TABLE 表名、列名是关键字,使用反单引号引起来时,会转换成双引号。

  • ALTER TABLE DEFAULT 布尔类型 false 和 true 分别会被转换成 0 和 1; DEFAULT 表达式用双引号引起的,会转换成单引号引起来。

  • ALTER TABLE TABLE_NAME DROP INDEX INDEX_NAME 会被转换成 DROP INDEX INDEX_NAME。

  • ALTER TABLE TABLE_NAME DROP PRIMARY KEY 转换语句不改变。

  • ALTER TABLE TABLE_NAME 转换涉及类型,按照 MySQL 转 OceanBase-Oracle 的逻辑。

  • ALTER TABLE TABLE_NAME CHARACTER SET 字符集设置,COLLATE 排序规则设置转换时会忽略。

  • ALTER TABLE TABLE_NAM ADD INDEX 会直接转换成 CREATE INDEX 语句。

  • 如果字段类型是DATATIME/TIMESTAMP, 则DEFAULT 值不支持时间格式的字符串,如 DEFAULT ‘2023-01-01 00:00:00’。

示例

-- 转换前MySQL SQL:
ALTER TABLE test_table DROP PRIMARY KEY;
ALTER TABLE test_table DROP INDEX idx_co12;
ALTER TABLE test_table ADD COLUMN IF NOT EXISTS co5 VARCHAR(20) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT 'this is a comment';
ALTER TABLE test_table MODIFY COLUMN co5 text CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT 'test column' COMMENT 'this is another comment';
ALTER TABLE test_table CHANGE COLUMN co5 co5_new blob DEFAULT NULL COMMENT 'this is a new comment';
ALTER TABLE test_table ADD INDEX idx_co5(co5);
ALTER TABLE test_table ADD KEY idx_co5_another(co5);
ALTER TABLE test_table RENAME INDEX idx_co5 TO idx_co5_new;
ALTER TABLE test_table CONVERT TO CHARACTER SET utf8;
ALTER TABLE test_table COMMENT 'this is a new table comment';
ALTER TABLE test_table ADD COLUMN mediumintColumn mediumint DEFAULT 0 ;
ALTER TABLE employees ADD COLUMN nickname VARCHAR(50) DEFAULT "none";
ALTER TABLE employees ADD is_admin number(1,0) DEFAULT FALSE;

-- 转换后OceanBase-Oracle SQL:
ALTER TABLE test_table DROP PRIMARY KEY;
DROP INDEX idx_co12;

ALTER TABLE test_table ADD co5 varchar2(20) DEFAULT NULL;
COMMENT ON COLUMN test_table.co5 IS 'this is a comment';

ALTER TABLE test_table ALTER COLUMN co5 text;
ALTER TABLE test_table ALTER COLUMN co5 DEFAULT 'test column';
COMMENT ON COLUMN test_table.co5 IS 'this is another comment';

ALTER TABLE test_table RENAME co5 TO co5_new;
ALTER TABLE test_table ALTER COLUMN co5_new bytea;
ALTER TABLE test_table ALTER COLUMN co5_new DEFAULT NULL;
COMMENT ON COLUMN test_table.co5_new IS 'this is a new comment';

CREATE INDEX idx_co5 ON test_table (co5);

CREATE INDEX idx_co5_another ON test_table (co5);

ALTER INDEX idx_co5 RENAME TO idx_co5_new;

-- unisql.replace.sql = 'select 1'
select 1;

COMMENT ON TABLE test_table IS 'this is a new table comment';

ALTER TABLE unisql_mediumint_test ADD mediumintColumn int DEFAULT 0;

3.3.4.3.4. 删除表

语法

DROP TABLE TABLE_NAME

示例

-- 转换前MySQL SQL:
DROP TABLE test_table;

-- 转换后OceanBase-Oracle SQL:
DROP TABLE test_table;

3.3.4.3.5. 创建用户

语法

CREATE USER USER_NAME@HOST_NAME IDENTIFIED BY PASSWORD

示例

-- 转换前MySQL SQL:
CREATE USER 'user1'@'localhost' IDENTIFIED BY '123456';

-- 转换后OceanBase-Oracle SQL:
CREATE USER "user1" IDENTIFIED BY "123456";

3.3.4.3.6. 修改用户

语法

ALTER USER USER_NAME@HOST_NAME
[IDENTIFIED BY NEW_PASSWORD]
| [ACCOUNT LOCK | UNLOCK]

示例

-- 转换前MySQL SQL:
ALTER USER 'user1'@'localhost' IDENTIFIED BY 'abc567890';
ALTER USER 'user1'@'localhost' ACCOUNT LOCK;
ALTER USER 'user1'@'localhost' ACCOUNT UNLOCK;

-- 转换后OceanBase-Oracle SQL:
ALTER USER "user1" IDENTIFIED BY "abc567890";
ALTER USER "user1" ACCOUNT LOCK;
ALTER USER "user1" ACCOUNT UNLOCK;

3.3.4.4. GaussDB-Mysql

3.3.4.4.1. 创建含注释的表

语法

CREATE TABLE table_name(
    ......
) comment [=] 'xxx';

示例

-- 转换前MySQL SQL:
    CREATE TABLE employees (
        id INT,
            name varchar(100),
        last_login TIMESTAMP(6)
    ) COMMENT "用户信息表";

-- 转换后GaussDB-Mysql SQL:
CREATE TABLE `employees` (
    `id` bigint,
    `name` varchar(100),
    `last_login` timestamp(6)
) COMMENT = '用户信息表';

3.3.4.4.2. 创建含行格式的表

语法

CREATE TABLE table_name(
    ......
) ROW_FORMAT [=] rowformatname;

警告

  • M模式只支持DYNAMIC,COMPRESSED,REDUNDANT,COMPACT行格式,其它行格式不支持

  • M模式行格式转换后为语法糖,目标数据库执行不报错即可,不考虑功能实现

  • M模式GaussDB-Mysql创建数据库语法只支持505.2版本(需要设置unisql.target.database.version = 5050200),其它版本不支持

  • B模式中ROW_FORMAT仅支持DEFAULT、DYNAMIC、FIXED、COMPRESSED、REDUNDANT、COMPACT, 其他选项会语法解析报错

  • B模式中ROW_FORMAT做语法糖处理

GaussDB MySQL 505.2 版本 M模式 示例

-- 转换前MySQL SQL:
CREATE TABLE rowformat_51969 (
    id INT,
        name varchar(100)
) ROW_FORMAT REDUNDANT;

-- 转换后GaussDB-Mysql SQL:
CREATE TABLE `rowformat_51969` (`id` bigint,`name` varchar(100)) ROW_FORMAT = REDUNDANT;

GaussDB MySQL 505.2 版本 B模式 示例

-- 转换前MySQL SQL:
CREATE TABLE rowformat_test (
    id INT,
        name varchar(100)
) ROW_FORMAT REDUNDANT;

-- 转换后GaussDB-Mysql SQL:
CREATE TABLE `rowformat_test` (`id` int,`name` varchar(100));

3.3.4.4.3. 创建含fulltext key的表

语法

CREATE TABLE TABLE_NAME(
COLUMN_NAME DATATYPE [...]
[, ...]
[, FULLTEXT [KEY] [FULL_INDEX_NAME](COLUMN_NAME [, ...])]
)

警告

  • fulltext 只是转换成了普通索引

示例

-- 转换前MySQL SQL:
CREATE TABLE test_table(
id int ,
co1 varchar(20) DEFAULT 'abc' COMMENT 'this is a test column',
PRIMARY KEY(id),
FULLTEXT KEY idx_co1(co1)
)

-- 转换后GaussDB-Mysql SQL:
CREATE TABLE `test_table` (`id` bigint,`co1` varchar(20) DEFAULT 'abc' COMMENT 'this is a test column',PRIMARY KEY(`id`),INDEX `idx_co1`(`co1`))

3.3.4.4.4. 创建指定ENGINE的表

语法

CREATE TABLE table_name(
    ......
) ENGINE [=] enginename;

警告

  • ENGINE选项统一SQL不做转换, 原样输出, 在目标库是语法糖, 无实际功能;

  • 指定ENGINE的功能只在505.2版本支持

示例

 -- 转换前MySQL SQL:
 CREATE TABLE test123 (
     id INT
 ) ENGINE InnoDB;

 -- 转换后GaussDB-Mysql SQL:
CREATE TABLE `test123` (`id` bigint) ENGINE = InnoDB;

3.3.4.4.5. 创建指定字符集和字符序的表

语法

CREATE TABLE table_name(
    ......
) DEFAULT CHARACTER SET charset_name COLLATE collation_name;

示例

 -- 转换前MySQL SQL:
 CREATE TABLE tb (
     id INT
 ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

 -- 转换后GaussDB-Mysql SQL:
CREATE TABLE `tb` (`id` bigint) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

3.3.4.4.6. 整理表数据

语法

OPTIMIZE TABLE table_name [, table_name];

警告

  • OPTIMIZE的NO_WRITE_TO_BINLOG和LOCAL选项不支持

示例

-- 转换前MySQL SQL:
    optimize table test_a_51969, test_b_51969;

-- 转换后GaussDB-Mysql SQL:
    VACUUM `test_a_51969`;
    VACUUM `test_b_51969`;

3.3.4.4.7. 创建数据库

语法

CREATE {DATABASE|SCHEMA} [IF NOT EXISTS] database_name [default character set xxx] [collate xxx];

警告

  • 将create database转换成create schema,需要修改统一sql配置项unisql.change.database.to.schema=1

  • 同一个sql语句转换在统一sql中存在缓存,如果实例不重启的话会命中缓存,不会走转换逻辑,所以改了参数也没有用

  • GaussDB-Mysql M 模式
    • character目前只支持utf8,COLLATE只支持utf8_general_ci,其他character/collate透传,但是不保证执行成功和语义一致

    • 只支持505.2版本,需要设置统一sql配置项unisql.target.database.version = 5050200

  • GaussDB-Mysql B 模式(默认版本 505.2),关于如何确认目标库是否为 B 模式,具体参考:修改索引名称
    • create database语句 或者 create schema 语句 均 不支持 关键字if not exists

    • create database语句 ,不支持 字符集(character set) 和 字符序(collate),语法糖处理,转换后的sql 去除字符集和字符序

    • create schema 语句 ,支持 字符集(character set) 和 字符序(collate)。

GaussDB-Mysql M 模式示例

-- 转换前MySQL SQL:
    create database if not exists database2_51969 default character set utf8 collate  utf8_general_ci;

-- 转换后GaussDB-Mysql SQL:
    CREATE DATABASE IF NOT EXISTS `database2_51969` CHARACTER SET = utf8 COLLATE = utf8_general_ci;

-- 修改配置unisql.change.database.to.schema将create database转换成create schema
    EXEC SET unisql.change.database.to.schema = 1

-- 转换前MySQL SQL:
    create database if not exists database2_51969 default character set utf8 collate  utf8_general_ci;

-- 转换后GaussDB-Mysql SQL:
    CREATE SCHEMA IF NOT EXISTS `database2_51969` CHARACTER SET = utf8 COLLATE = utf8_general_ci;

GaussDB-Mysql B 模式示例

-- 转换前,统一sql配置项unisql.change.database.to.schema为0,转换逻辑:if not exists ,字符集和字符序,均语法糖处理
    create database if not exists database_test default character set utf8 collate  utf8_general_ci;

-- 转换后,
    CREATE DATABASE `database_test`

-- 转换前,统一sql配置项unisql.change.database.to.schema为1
    create database if not exists database_test default character set utf8 collate  utf8_general_ci;

-- 转换后,目标库gaussdb mysql b模式,支持create schema语句中包含字符集或者字符序
    CREATE SCHEMA `database_test` CHARACTER SET = utf8 COLLATE = utf8_general_ci

 -- 转换前,统一sql配置项unisql.change.database.to.schema为1
    create schema if not exists database_test_1 default character set utf8 collate  utf8_general_ci;

 -- 转换后,目标库gaussdb mysql b模式,支持create schema语句中包含字符集或者字符序
    CREATE SCHEMA `database_test_1` CHARACTER SET = utf8 COLLATE = utf8_general_ci

3.3.4.4.8. 切库

语法

use database_name ;

警告

  1. 统一sql参数配置

    • unisql.change.database.to.schema:控制数据库相关语句的转换行为

      • 值为 0:原样透传,不进行转换

      • 值为 1:启用以下转换规则

        -- 示例: USE DATABASE转换,unisql.change.database.to.schema=1
        use acm;
        -- 转换后:
        SET SCHEMA 'acm';
        
  2. 缓存注意事项

    同一个SQL语句转换在统一SQL中存在缓存,如果实例不重启,会命中缓存而不触发转换逻辑,此时修改参数无效。

  3. 版本与模式限制

    • 切库语句(use database_name),只支持GaussDB-Mysql B模式(默认版本 505.2),目标库B模式确认方法参考:修改索引名称

GaussDB-Mysql B 模式示例

-- 转换前USE DATABASE,unisql.change.database.to.schema=1
            use acm;

-- 转换后GaussDB-Mysql B模式 SQL:
    SET SCHEMA 'acm';

3.3.4.4.9. 删除数据库

语法

DROP {DATABASE|SCHEMA} [IF EXISTS] database_name;

警告

  • 将drop database转换成drop schema,需要修改配置unisql.change.database.to.schema为1

  • 同一个sql语句转换在统一sql中存在缓存,如果实例不重启的话会命中缓存,不会走转换逻辑,所以改了参数也没有用

  • GaussDB-Mysql系(B模式或者M模式)删除数据库语法只支持505.2版本(需要设置unisql.target.database.version = 5050200),其它版本不支持

  • 目标库支持GaussDB-Mysql B模式和GaussDB-Mysql M模式,关于如何确认目标库是否为 B 模式,具体参考:修改索引名称

示例

-- 转换前MySQL SQL:
    drop database database_test1;

-- 转换后GaussDB-Mysql SQL:
    DROP DATABASE `database_test1`;

-- 修改配置unisql.change.database.to.schema将drop database转换成drop schema
    EXEC SET unisql.change.database.to.schema = 1

-- 转换前MySQL SQL:
    drop database database_test1;

-- 转换后GaussDB-Mysql SQL:
    DROP SCHEMA `database_test1`;

3.3.4.4.10. 设置外键约束

语法

SET FOREIGN_KEY_CHECKS = {0 | 1}

警告

其中 0 表示禁用外键约束, 1 表示启用外键约束; 在GaussDB 505.2版本支持

示例

-- 转换前MySQL SQL:
SET FOREIGN_KEY_CHECKS = 0;
SET FOREIGN_KEY_CHECKS = 1;

-- 转换后GaussDB-Mysql SQL:
SET FOREIGN_KEY_CHECKS=0;
SET FOREIGN_KEY_CHECKS=1;

3.3.4.4.11. 修改用户

语法

ALTER USER USER_NAME@HOST_NAME
[IDENTIFIED BY NEW_PASSWORD]
| [ACCOUNT LOCK | UNLOCK]

示例

-- 转换前MySQL SQL:
ALTER USER 'user1'@'localhost' IDENTIFIED BY 'abc567890';
ALTER USER 'user1'@'localhost' ACCOUNT LOCK;
ALTER USER 'user1'@'localhost' ACCOUNT UNLOCK;

-- 转换后GaussDB-Mysql SQL:
ALTER USER `user1` IDENTIFIED BY 'abc567890';
ALTER USER `user1` ACCOUNT LOCK;
ALTER USER `user1` ACCOUNT UNLOCK;

3.3.4.4.12. 转换表的字符集和排序规则

语法

ALTER TABLE table_name CONVERT TO CHARACTER SET charset_name [COLLATE collation_name];

警告

  • 支持的字符集 utf8、utf8mb4、utf8mb3、latin1、binary、gbk

  • 支持的字符序 utf8mb4_unicode_ci, utf8mb4_general_ci, latin1_swedish_ci…

  • 字符集自动转换 utf8mb3转换后是utf8

  • 字符序自动转换 utf8mb3_bin 转换后是utf8_bin

  • 其他字符集(比如utf16、gb18030、big5),统一sql解析报错

  • 字符集与字符序不匹配的情况,比如ALTER TABLE t15 CONVERT TO CHARACTER SET latin1 COLLATE utf8mb4_unicode_ci;字符集latin1和utf8mb4_unicode_ci,统一sql透传,但在目标库执行报错

示例

-- 转换前,仅转换字符集(无COLLATE)
ALTER TABLE legacy_data CONVERT TO CHARACTER SET utf8mb4;
-- 转换后
ALTER TABLE `legacy_data` CONVERT TO CHARACTER SET utf8mb4;

-- 转换前,转换字符集+COLLATE(支持的情况)
ALTER TABLE legacy_data CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 转换后
ALTER TABLE `legacy_data` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 转换前,不支持的字符集(utf16)→ 直接报错
ALTER TABLE `tbl_data` CONVERT TO CHARACTER SET utf16;
-- 转换结果
[ERROR] Unsupported character set: utf16

-- 转换前,不支持的字符集(ascii)→ 直接报错
ALTER TABLE `tbl_data` CONVERT TO CHARACTER SET ascii;
-- 转换结果
[ERROR] Unsupported character set: ascii

-- 转换前,不支持的字符集(gb18030)→ 直接报错
ALTER TABLE t2 CONVERT TO CHARACTER SET gb18030;
-- 转换结果
[ERROR] Unsupported character set: gb18030


-- 转换前,字符序gb18030_chinese_ci
ALTER TABLE `tbl_data` COLLATE gb18030_chinese_ci;
-- 转换后
ALTER TABLE `tbl_data` DEFAULT COLLATE = gb18030_chinese_ci;

-- 转换前,字符集自动转换(utf8mb3 → utf8)
ALTER TABLE old_table CONVERT TO CHARACTER SET utf8mb3;
-- 转换后
ALTER TABLE `old_table` CONVERT TO CHARACTER SET utf8;

-- 转换前,COLLATE自动转换(utf8mb3_bin → utf8_bin)
ALTER TABLE case_sensitive_table CONVERT TO CHARACTER SET utf8 COLLATE utf8mb3_bin;
-- 转换后
ALTER TABLE `case_sensitive_table` CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;

-- 转换前,字符集与COLLATE不匹配(latin1 + utf8mb4_unicode_ci)→ 语法透传但目标库报错
ALTER TABLE t15 CONVERT TO CHARACTER SET latin1 COLLATE utf8mb4_unicode_ci;
-- 转换后
ALTER TABLE `t15` CONVERT TO CHARACTER SET latin1 COLLATE utf8mb4_unicode_ci;

3.3.4.4.13. 为表添加列

语法

ALTER TABLE table_name
ADD [COLUMN] [IF NOT EXISTS]
    col_name column_definition
[ FIRST | AFTER existing_column];

| ADD [COLUMN] [IF NOT EXISTS] (col_name column_definition, [...])
column_definition:
- data_type
- [NOT NULL | NULL] [DEFAULT default_value]
- [ON UPDATE  CURRENT_TIMESTAMP]
- [AUTO_INCREMENT] [ZEROFILL] [UNIQUE [KEY]] [PRIMARY KEY]
- COMMENT 'string'

警告

  • GaussDB MySQL 505.2 版本 M模式,不支持 IF NOT EXISTS和ZEROFILL ,统一sql语法糖处理,源sql包含,转换后没有;依赖统一sql配置项unisql.target.database.version,举例unisql.target.database.version=5050200,表示配置数据库版本505.2

  • GaussDB MySQL 505.2 版本 B模式,
    • 语法格式 ADD [COLUMN] [IF NOT EXISTS] col_name column_definition [ FIRST | AFTER existing_column], 支持 关键字 IF NOT EXISTS

    • 语法格式 ADD [COLUMN] [IF NOT EXISTS] (col_name column_definition, […]) 不支持 关键字 IF NOT EXISTS,语法糖处理,转换后去掉IF NOT EXISTS,举例 alter table employees_11 add if not exists (phone11 varchar(20))

    • ZEROFILL ,统一sql语法糖处理,源sql包含,转换后没有

    • 如何确定当前目标库是gaussdb mysql的B模式具体参考: 修改索引名称 中说明

  • 添加列,数据类型,函数以当前统一sql转换的实现为主。

GaussDB MySQL 505.2 版本 M模式 示例

-- 转换前,添加单列(带默认值,非空约束和位置信息)
ALTER TABLE user_info ADD COLUMN email VARCHAR(100) NOT NULL DEFAULT 'unknown@example.com' AFTER username;

-- 转换后
ALTER TABLE `user_info` ADD `email` varchar(100) NOT NULL DEFAULT 'unknown@example.com' AFTER `username`

-- 转换前,添加多列(含不同属性)
ALTER TABLE user_info
ADD (
    age TINYINT UNSIGNED ZEROFILL NULL DEFAULT 18 COMMENT '年龄',
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP(3)
);

-- 转换后,添加多列(含不同属性)
ALTER TABLE `user_info` ADD (`age` tinyint NULL DEFAULT 18 COMMENT '年龄', `created_at` datetime DEFAULT CURRENT_TIMESTAMP(), `updated_at` timestamp DEFAULT CURRENT_TIMESTAMP() ON UPDATE CURRENT_TIMESTAMP(3))

-- 转换前,if not exists 防止重复添加
ALTER TABLE user_info ADD COLUMN IF NOT EXISTS mobile CHAR(11) AFTER age;

--转换后
ALTER TABLE `user_info` ADD  `mobile` char(11) AFTER `age`

GaussDB MySQL 505.2 版本 B模式 示例

转换前

-- 转换前,添加单列(带默认值、非空约束和位置信息)
ALTER TABLE user_info ADD COLUMN email VARCHAR(100) NOT NULL DEFAULT 'unknown@example.com' AFTER username;

-- 转换前,IF NOT EXISTS 防止重复添加
ALTER TABLE user_info ADD COLUMN IF NOT EXISTS mobile CHAR(11) AFTER age;

-- 转换前,添加单列(带属性和注释)
ALTER TABLE user_info ADD COLUMN IF NOT EXISTS ( age TINYINT UNSIGNED ZEROFILL NULL DEFAULT 18 COMMENT '年龄' );

-- 转换前,添加多列(含不同属性)
ALTER TABLE user_info
ADD (
    age TINYINT UNSIGNED ZEROFILL NULL DEFAULT 18 COMMENT '年龄',
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP(3)
);

转换后

ALTER TABLE `user_info` ADD `email` varchar(100) NOT NULL DEFAULT 'unknown@example.com' AFTER `username`
ALTER TABLE `user_info` ADD IF NOT EXISTS `mobile` char(11) AFTER `age`
ALTER TABLE `user_info` ADD (`age` tinyint NULL DEFAULT 18 COMMENT '年龄')
ALTER TABLE `user_info` ADD (`age` tinyint NULL DEFAULT 18 COMMENT '年龄', `created_at` datetime DEFAULT CURRENT_TIMESTAMP(), `updated_at` timestamp(6) DEFAULT CURRENT_TIMESTAMP() ON UPDATE CURRENT_TIMESTAMP(3))

3.3.4.4.14. 为表添加索引

语法

ALTER TABLE table_name
    ADD [UNIQUE] [INDEX|KEY] [IF NOT EXISTS] [index_name]
    [index_type] (index_col_name,...) [index_option] ...

    解释:
    [index_type]表示索引类型
    index_type:
            USING {BTREE}

    [index_option]表示其他索引选项
    index_option:
            COMMENT 'string'

警告

  • `IF NOT EXISTS` 支持情况

    • GaussDB MySQL 505.2 版本(M模式)不支持 IF NOT EXISTS 。统一 SQL 层会将其作为语法糖处理(源 SQL 包含该语法,但转换后的 SQL 会移除)。

      • 需通过 unisql.target.database.version=5050200 显式指定目标数据库版本(5050200 表示 505.2)。

    • GaussDB MySQL 505.2 版本(B模式,默认版本505.2)支持 IF NOT EXISTS 语法。关于如何确认目标库是否为 B 模式,具体参考:修改索引名称

  • GaussDB MySQL B 模式(默认版本 505.2 )语法兼容性

    • 经过统一sql转换后语法格式CREATE [UNIQUE] INDEX index_name ON table (col1,col2…) COMMENT ‘xxx’

    • 统一sql会将全文索引转换为普通索引

    • 索引类型 BTREE 经过统一sql转换后为空,在目标库GaussDB MySQL B 模式(默认版本505.2)默认索引类型为 BTREE

  • 索引的功能和用途限制: 仅支持 普通索引(INDEX|KEY),唯一索引(UNIQUE INDEX),全文索引(Fulltext),其他索引统一sql解析报错,比如空间索引(Spatial)。

  • 索引类型限制: 仅支持 BTREE 索引类型,尝试使用 HASH 或其他类型,统一sql解析报错。

  • 索引选项处理规则:

    • 索引选项(如 COMMENTVISIBLEINVISIBLE)会透传到执行层,但在目标库 GaussDB for MySQL 505.2 版本(不论M模式还是B模式)中,使用 VISIBLEINVISIBLE 时会出现语法错误,而 COMMENT 选项则可以正常使用。

    • 不支持的索引选项包括:

      • KEY_BLOCK_SIZE

      • WITH PARSER

      • CLUSTERING

      • IGNORED

      • NOT IGNORED

    • 以上索引选项在该环境下统一 SQL 解析会报错。

示例gaussdb mysql 505.2 M模式

-- 转换前,1. 添加普通单列索引
ALTER TABLE employees ADD INDEX idx_last_name (last_name);
-- 转换后
ALTER TABLE `employees` ADD INDEX `idx_last_name`(`last_name`)

-- 转换前,2. 添加唯一索引(多列)
ALTER TABLE employees ADD UNIQUE uidx_name_dob (first_name, date_of_birth);
-- 转换后
ALTER TABLE `employees` ADD UNIQUE `uidx_name_dob` (`first_name`, `date_of_birth`)

-- 转换前,3. 使用IF NOT EXISTS,避免重复
ALTER TABLE employees ADD KEY IF NOT EXISTS idx_salary (salary);
-- 转换后
ALTER TABLE `employees` ADD INDEX `idx_salary`(`salary`)

-- 转换前,4. 指定索引类型(如 USING BTREE)
ALTER TABLE employees ADD INDEX idx_email USING BTREE (email);
-- 转换后
ALTER TABLE `employees` ADD INDEX `idx_email`(`email`) USING BTREE

-- 转换前,5. 添加带索引选项(如COMMENT)
ALTER TABLE employees ADD UNIQUE INDEX idx_department (department_id) COMMENT 'Index for department ID';
-- 转换后
ALTER TABLE `employees` ADD UNIQUE `idx_department`(`department_id`) COMMENT 'Index for department ID'

-- 转换前,6.为表employees添加不可见索引
ALTER TABLE employees ADD INDEX idx_salary (salary) INVISIBLE;
-- 转换后
ALTER TABLE `employees` ADD INDEX `idx_salary`(`salary`) INVISIBLE

-- 转换前,7. 添加索引,不指定索引名称
ALTER TABLE  users ADD INDEX (email);
-- 转换后
ALTER TABLE `users` ADD INDEX(`email`)

-- 转换前,8. 使用关键字 UNIQUE INDEX IF NOT EXISTS
ALTER TABLE employees ADD UNIQUE INDEX IF NOT EXISTS(name);
-- 转换后
ALTER TABLE `employees` ADD UNIQUE (`name`)

示例gaussdb mysql 505.2 B模式

-- 转换前
    ALTER TABLE employees ADD INDEX idx_last_name (last_name);
    ALTER TABLE employees ADD UNIQUE uidx_name_dob (first_name, date_of_birth);
    ALTER TABLE employees ADD KEY IF NOT EXISTS idx_salary (salary);
    ALTER TABLE employees ADD INDEX idx_email USING BTREE (email);
    ALTER TABLE employees ADD UNIQUE INDEX idx_department (department_id) COMMENT 'Index for department ID';
    ALTER TABLE employees ADD INDEX idx_salary (salary) INVISIBLE;
    ALTER TABLE  users ADD INDEX (email);
    ALTER TABLE employees ADD UNIQUE INDEX IF NOT EXISTS(name);
-- 转换后
    CREATE INDEX `idx_last_name` ON `employees` (`last_name`)
    CREATE UNIQUE INDEX `uidx_name_dob` ON `employees` (`first_name`, `date_of_birth`)
    CREATE INDEX IF NOT EXISTS `idx_salary` ON `employees` (`salary`)
    CREATE INDEX `idx_email` ON `employees` (`email`)
    CREATE UNIQUE INDEX `idx_department` ON `employees` (`department_id`) COMMENT 'Index for department ID'
    CREATE INDEX `idx_salary` ON `employees` (`salary`) INVISIBLE
    CREATE INDEX ON `users` (`email`)
    CREATE UNIQUE INDEX IF NOT EXISTS  ON `employees` (`name`)

3.3.4.4.15. alter table 支持 ignore和if exists

语法

ALTER [IGNORE] TABLE [IF EXISTS] table_name xxx;

其中xxx支持:
            添加列(ADD [COLUMN]),
            修改列 (CHANGE [COLUMN]),
            删除列 (DROP [COLUMN]),
            添加索引 (ADD {INDEX|KEY}),
            转换字符集和字符序(CONVERT TO CHARACTER SET charset_name [COLLATE collation_name])等

警告

  • `IF EXISTS` 和 `IGNORE` 支持情况:

    • GaussDB MySQL 505.2 版本(M模式)不支持 IF EXISTSIGNORE。统一 SQL 层会将其作为语法糖处理(源 SQL 包含该语法,但转换后的 SQL 会移除)。

    • GaussDB MySQL 505.2 版本(B模式,默认版本505.2)不支持 IGNORE ,支持 IF EXISTSIGNORE 语法糖处理,转换后的sql去除 IGNORE 。如何确定当前目标库是gaussdb mysql的B模式具体参考: 修改索引名称 中说明

  • 依赖配置项: GaussDB MySQL 505.2 版本(M模式),需通过 unisql.target.database.version=5050200 显式指定目标数据库版本(5050200 表示 505.2)。

GaussDB MySQL 505.2 版本(M模式)示例

-- 转换前,alter table 使用关键字 ignore 和 if exists,添加唯一索引
ALTER IGNORE TABLE IF EXISTS employees ADD UNIQUE INDEX idx_email (email);
-- 转换后
ALTER TABLE `employees` ADD UNIQUE `idx_email` (`email`)

-- 转换前,alter table 使用关键字 IF EXISTS 添加列
ALTER TABLE IF EXISTS employees  ADD COLUMN department VARCHAR(50) AFTER last_name;
-- 转换后
ALTER TABLE `employees` ADD `department` varchar(50) AFTER `last_name`

-- 转换前,alter table 使用关键字 ignore ,添加索引
ALTER IGNORE TABLE employees ADD INDEX idx_username (username);
-- 转换后
ALTER TABLE `employees` ADD INDEX `idx_username`(`username`)

-- 转换前,alter table 删除hire_date列
ALTER TABLE employees DROP COLUMN hire_date;
-- 转换后
ALTER TABLE `employees` DROP COLUMN `hire_date`

GaussDB MySQL 505.2 版本(B模式)示例

转换前SQL

-- alter table 使用关键字 if exists,添加唯一索引
ALTER IGNORE TABLE IF EXISTS employees ADD UNIQUE INDEX idx_email (email);

-- alter table 使用关键字 IF EXISTS 添加列
ALTER TABLE IF EXISTS employees ADD COLUMN department VARCHAR(50) AFTER last_name;

    -- alter table if exists table_name 修改列
ALTER TABLE IF EXISTS employees change COLUMN department department_2 VARCHAR(50) AFTER last_name;

-- alter table 使用关键字 ignore ,添加索引
ALTER IGNORE TABLE employees ADD INDEX idx_username (username);

    -- alter table 删除hire_date列
ALTER TABLE employees DROP COLUMN hire_date;

转换后SQL

CREATE UNIQUE INDEX `idx_email` ON `employees` (`email`)
ALTER TABLE IF EXISTS `employees` ADD `department` varchar(50) AFTER `last_name`
ALTER TABLE IF EXISTS `employees` CHANGE COLUMN `department` `department_2` varchar(50) AFTER `last_name`
CREATE INDEX `idx_username` ON `employees` (`username`)
ALTER TABLE `employees` DROP COLUMN `hire_date`

3.3.4.4.16. 修改现有列

语法

ALTER TABLE table_name
CHANGE [COLUMN] [IF EXISTS] old_column new_column column_definition
[ FIRST | AFTER existing_column];

column_definition:
- data_type数据类型
- [NOT NULL | NULL] [DEFAULT default_value]
- [ON UPDATE CURRENT_TIMESTAMP]
- [AUTO_INCREMENT] [ZEROFILL] [UNIQUE [KEY]] [PRIMARY KEY]
- COMMENT 'string'

警告

  • GaussDB MySQL 505.2 版本(M模式)
    • 不支持 IF EXISTS和ZEROFILL ,统一sql语法糖处理,源sql包含,转换后没有。

    • 依赖统一sql配置项unisql.target.database.version,举例unisql.target.database.version=5050200,表示配置数据库版本505.2

  • GaussDB MySQL 505.2 版本(B模式,默认505.2版本) 不支持 IF EXISTS,不支持 zerofill,zerofill 统一sql语法糖处理, 如何确定当前目标库是gaussdb mysql的B模式具体参考: 修改索引名称 中说明

  • 修改列,数据类型,函数以当前统一sql转换的实现为主。

GaussDB MySQL 505.2 版本(M模式)示例

-- 转换前,重命名列
ALTER TABLE users CHANGE COLUMN old_username new_username VARCHAR(50) NOT NULL DEFAULT 'guest' AFTER id;
-- 转换后
ALTER TABLE `users` CHANGE COLUMN `old_username` `new_username` varchar(50) NOT NULL DEFAULT 'guest' AFTER `id`

-- 转换前,修改列数据类型(这里没有使用关键字COLUMN)
ALTER TABLE orders CHANGE order_date order_date DATETIME NOT NULL;
-- 转换后
ALTER TABLE `orders` CHANGE COLUMN `order_date` `order_date` datetime NOT NULL

-- 转换前,调整列位置,这里使用了关键字COLUMN 和 if exists
ALTER TABLE products CHANGE COLUMN if exists price price DECIMAL(10,2) AFTER product_name;
-- 转换后
ALTER TABLE `products` CHANGE COLUMN `price` `price` decimal(10,2) AFTER `product_name`

-- 转换前,修改多列
ALTER TABLE legacy_data CHANGE COLUMN name name VARCHAR(30) NOT NULL,CHANGE COLUMN id id INT DEFAULT 0 COMMENT '年龄' AFTER name;
-- 转换后
ALTER TABLE `legacy_data` CHANGE COLUMN `name` `name` varchar(30) NOT NULL, CHANGE COLUMN `id` `id` int DEFAULT 0 COMMENT '年龄' AFTER `name`

-- 转换前,修改列属性增加ZEROFILL
ALTER TABLE test_table CHANGE COLUMN id id INT ZEROFILL
-- 转换后
ALTER TABLE `test_table` CHANGE COLUMN `id` `id` int

-- 转换前,修改列属性CURRENT_TIMESTAMP带精度
ALTER TABLE test_table CHANGE COLUMN order_date order_date TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)
-- 转换后
ALTER TABLE `test_table` CHANGE COLUMN `order_date` `order_date` timestamp DEFAULT CURRENT_TIMESTAMP() ON UPDATE CURRENT_TIMESTAMP(3)

GaussDB MySQL 505.2 版本(B模式)示例

转换前 SQL 语句:

-- 重命名列
ALTER TABLE users
    CHANGE COLUMN old_username new_username VARCHAR(50) NOT NULL DEFAULT 'guest'
    AFTER id;

-- 修改列数据类型(这里没有使用关键字 COLUMN )
ALTER TABLE orders
    CHANGE order_date order_date DATETIME NOT NULL;

-- 调整列位置,这里使用了关键字 COLUMN 和 if exists
ALTER TABLE products
    CHANGE COLUMN if exists price price DECIMAL(10,2)
    AFTER product_name;

-- 修改多列
ALTER TABLE legacy_data
    CHANGE COLUMN name name VARCHAR(30) NOT NULL,
    CHANGE COLUMN id id INT DEFAULT 0 COMMENT '年龄'
    AFTER name;

-- 修改列属性增加 ZEROFILL
ALTER TABLE test_table
    CHANGE COLUMN id id INT ZEROFILL;

-- 修改列属性 CURRENT_TIMESTAMP 带精度
ALTER TABLE test_table
    CHANGE COLUMN order_date order_date TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3);

转换后 SQL 语句:

ALTER TABLE `users` CHANGE COLUMN `old_username` `new_username` varchar(50) NOT NULL DEFAULT 'guest' AFTER `id`
ALTER TABLE `orders` CHANGE COLUMN `order_date` `order_date` datetime NOT NULL
ALTER TABLE `products` CHANGE COLUMN `price` `price` decimal(10,2) AFTER `product_name`
ALTER TABLE `legacy_data` CHANGE COLUMN `name` `name` varchar(30) NOT NULL, CHANGE COLUMN `id` `id` bigint DEFAULT 0 COMMENT '年龄' AFTER `name`
ALTER TABLE `test_table` CHANGE COLUMN `id` `id` bigint
ALTER TABLE `test_table` CHANGE COLUMN `order_date` `order_date` timestamp(3) ON UPDATE CURRENT_TIMESTAMP(3)

3.3.4.4.17. 修改表给表加注释

语法

ALTER  TABLE  table_name COMMENT [=] xxx; -- xxx表示注释内容

警告

  • GaussDB MySQL 505.2 版本支持的表注释的内容长度<=2048

  • GaussDB MySQL 505.2 版本支持的表注释的内容支持常见的特殊字符,比如COMMENT = ‘表!@#$%^&*()_+-=[]{}| ;:”,.<>?/~’

  • GaussDB MySQL 505.2 版本支持的表注释的内容支持多语言字符,比如 COMMENT ‘员工表(中文) 테이블(韩文) テーブル(日文) Таблица(俄文)’

  • GaussDB MySQL 505.2 版本支持的表注释的内容支持Emoji 表情,比如 COMMENT = ‘员工信息表 😊👍🌟’

示例

-- 包含转义字符
ALTER TABLE employees COMMENT 'Line1\nLine2\tTab\\Backslash';
--转换后
ALTER TABLE `employees` COMMENT = 'Line1\nLine2\tTab\\Backslash'

-- 包含Emoji表情
ALTER TABLE employees COMMENT '员工信息表 😊👍🌟';
--转换后
ALTER TABLE `employees` COMMENT = '员工信息表 😊👍🌟'

-- 包含常见特殊字符
ALTER TABLE employees COMMENT = '表!@#$%^&*()_+-=[]{}|;:",.<>?/`~';
-- 转换后
ALTER TABLE `employees` COMMENT = '表!@#$%^&*()_+-=[]{}| ;:",.<>?/~'

-- 多语言字符
ALTER TABLE employees COMMENT '员工表(中文) 테이블(韩文) テーブル(日文) Таблица(俄文)';
--转换后
ALTER TABLE `employees` COMMENT = '员工表(中文) 테이블(韩文) テーブル(日文) Таблица(俄文)'

-- 包含SQL特殊字符
ALTER TABLE employees COMMENT 'DROP TABLE users; -- 测试注入';
-- 转换后
ALTER TABLE `employees` COMMENT = 'DROP TABLE users; -- 测试注入'

-- 缺少引号
ALTER TABLE employees COMMENT abcdef;
-- 转换后
ALTER TABLE `employees` COMMENT = 'abcdef'

3.3.4.4.18. 修改索引名称

语法

ALTER TABLE [IF EXISTS] schema_name.tbl_name
RENAME {INDEX|KEY} old_index_name TO new_index_name

警告

  • 索引名称长度限制:GaussDB MySQL 505.2 版本的索引名称最大支持 63 个字符。若源 SQL(MariaDB)中索引名称为 64 个字符(其最大支持长度为 64),导入至 GaussDB MySQL 505.2 时会自动截取前 63 个字符,超出部分将被截断。

  • 特殊字符处理:GaussDB MySQL 505.2 版本不支持直接使用 !@#$%^&* 等特殊字符作为标识符。若需使用,需用反引号(`)包裹转义。

  • M 模式语法兼容性
    • GaussDB MySQL 505.2 版本的 M 模式,不支持 ALTER TABLE 后有关键字 IF EXISTS 。SQL 转换时会统一处理此类语法糖,源 SQL 中的 IF EXISTS 语句转换后将被移除。

    • 依赖统一 SQL 配置项 unisql.target.database.version,例如设置为 5050200 表示目标数据库版本为 505.2。

  • B 模式语法兼容性
    • GaussDB MySQL 505.2 版本的 B 模式(默认版本505.2), 源SQL语法 ALTER TABLE [IF EXISTS] schema_name.tbl_name RENAME {INDEX|KEY} old_index_name TO new_index_name 转换后语法是 ALTER INDEX schema_name.old_index_name RENAME TO new_index_name;
      • 进一步解释 ALTER INDEX schema_name.old_index_name RENAME TO new_index_name; 这种语法,明确指定了要重命名的索引 old_index_name 所在的模式为 schema_name。重命名操作仅仅是改变索引的名称,并不会改变索引所属的模式(schema_name)。

    • GaussDB MySQL 505.2 版本的 B 模式(默认版本505.2), 不支持 在一个ALTER TABLE语句中混合操作,具体举例,alter table 语句同时进行修改索引名称和添加列,ALTER TABLE rename_index_55716 RENAME INDEX idx_name_no TO idx_name_new,ADD COLUMN age INT;

  • B 模式索引规则:GaussDB MySQL B 模式(默认版本505.2),索引名称在具体数据库下同一 Schema(模式)内需唯一。

  • 如何判断gaussdb mysql 是否是B 模式:可通过以下 SQL 查看当前gaussdb mysql的模式:

    SHOW SQL_COMPATIBILITY;
    

    示例输出

    +-------------------+
    | sql_compatibility |
    +-------------------+
    | B                 |
    +-------------------+
    
  • 若使用 GaussDB MySQL 505.2 版本的 B 模式,需配置以下参数(最好配置到gaussdb mysql实例的配置文件中),下面以当前会话级别设置参数为例:

    SET b_format_version = '5.7';
    SET b_format_dev_version = 's1';
    

GaussDB MySQL 505.2 版本 M模式 示例

-- 转换前
ALTER TABLE customers RENAME INDEX idx_customer_name TO idx_customer_fullname;
-- 转换后
ALTER TABLE `customers` RENAME INDEX `idx_customer_name` TO `idx_customer_fullname`

-- 转换前
ALTER TABLE customers RENAME KEY `idx-customer.email` TO `idx-customer-email`;
-- 转换后
ALTER TABLE `customers` RENAME INDEX `idx-customer.email` TO `idx-customer-email`

-- 转换前
ALTER TABLE IF EXISTS  non_existent_table  RENAME INDEX invalid_index TO new_index;
-- 转换后
ALTER TABLE `non_existent_table` RENAME INDEX `invalid_index` TO `new_index`

-- 转换前
ALTER TABLE orders RENAME INDEX `select` TO idx_order_date;
-- 转换后
ALTER TABLE `orders` RENAME INDEX `select` TO `idx_order_date`

GaussDB MySQL 505.2 版本 B模式 示例

-- 转换前
ALTER TABLE customers RENAME INDEX idx_customer_name TO idx_customer_fullname;
ALTER TABLE customers RENAME KEY `idx-customer.email` TO `idx-customer-email`;
ALTER TABLE IF EXISTS non_existent_table RENAME INDEX invalid_index TO new_index;
ALTER TABLE orders RENAME INDEX `select` TO idx_order_date;
ALTER TABLE my_database.orders RENAME INDEX idx_id TO idx_id_test;

-- 转换后
ALTER INDEX `idx_customer_name` RENAME TO `idx_customer_fullname`;
ALTER INDEX `idx-customer.email` RENAME TO `idx-customer-email`;
ALTER INDEX `invalid_index` RENAME TO `new_index`;
ALTER INDEX `select` RENAME TO `idx_order_date`;
ALTER INDEX `my_database`.`idx_id` RENAME TO `idx_id_test`

3.3.4.4.19. 创建表支持普通索引和唯一索引

语法

CREATE TABLE TABLE_NAME(
    COLUMN_NAME1 DATATYPE
    [, ...]
    [, INDEX INDEX_NAME(COLUMN_NAME [, ...])]
    [, KEY INDEX_NAME(COLUMN_NAME [, ...])]
    [, UNIQUE [KEY|INDEX] INDEX_NAME(COLUMN_NAME [, ...])]
)

警告

  • 索引名称长度限制:GaussDB MySQL 505.2 版本的索引名称最大支持 63 个字符。若源 SQL(MariaDB)中索引名称为 64 个字符(其最大支持长度为 64),导入至 GaussDB MySQL 505.2 时会自动截取前 63 个字符,超出部分将被截断。

  • 特殊字符处理:GaussDB MySQL 505.2 版本不支持直接使用 !@#$%^&* 等特殊字符作为标识符。若需使用,需用反引号(`)包裹转义。

  • B 模式索引规则:GaussDB MySQL B 模式(默认版本505.2),索引名称在具体数据库下同一 Schema(模式)内需唯一。

GaussDB MySQL 505.2 版本 B模式 示例

-- 转换前
CREATE TABLE t1(id int, c1 varchar(20), c2 int, index(id), key(c1), unique index(c2));
CREATE TABLE t1(id int, c1 varchar(20), c2 int, index idx_id(id), key idx_c1(c1), unique key uni_idx_c2 (c2));
CREATE TABLE t1(id int, c1 varchar(20), c2 int, index idx_id(id), key idx_c1(c1), unique index uni_idx_c2 (c2));


-- 转换后
CREATE TABLE `t1` (`id` int,`c1` varchar(20),`c2` int,UNIQUE(`c2`));CREATE INDEX `t1_id_idx` ON `t1` (`id`);CREATE INDEX `t1_c1_idx` ON `t1` (`c1`);
CREATE TABLE `t1` (`id` int,`c1` varchar(20),`c2` int,UNIQUE `uni_idx_c2`(`c2`));CREATE INDEX `idx_id` ON `t1` (`id`);CREATE INDEX `idx_c1` ON `t1` (`c1`);
CREATE TABLE `t1` (`id` int,`c1` varchar(20),`c2` int,UNIQUE `uni_idx_c2`(`c2`));CREATE INDEX `idx_id` ON `t1` (`id`);CREATE INDEX `idx_c1` ON `t1` (`c1`);

3.3.4.4.20. 删除表

语法

DROP TABLE [IF EXISTS] table_name

GaussDB MySQL 505.2 版本 B模式 示例

-- 转换前
DROP TABLE test_t1;
DROP TABLE IF EXISTS test_t1;


-- 转换后
DROP TABLE `test_t1`;
DROP TABLE IF EXISTS `test_t1`;

3.3.4.4.21. 建表语句指定索引存储结构

语法

CREATE TABLE TABLE_NAME(
    COLUMN_NAME1 DATATYPE
    [, ...]
    [, INDEX INDEX_NAME(COLUMN_NAME [, ...]) [USING BTREE]]
    [, KEY INDEX_NAME(COLUMN_NAME [, ...]) [USING BTREE]]
    [, UNIQUE [KEY|INDEX] INDEX_NAME(COLUMN_NAME [, ...]) [USING BTREE]]
)

警告

  • B模式中USING BTREE做语法糖处理

GaussDB MySQL 505.2 版本 B模式 示例

-- 转换前
CREATE TABLE t1(id int, PRIMARY KEY(id) USING BTREE);


-- 转换后
CREATE TABLE `t1` (`id` int,PRIMARY KEY(`id`) )

3.3.4.4.22. 修改表删除索引

语法

ALTER TABLE table_name DROP [CONSTRAINT] PRIMARY KEY;
ALTER TABLE table_name DROP INDEX|KEY [IF EXISTS] idx_name;
ALTER TABLE table_name DROP CONSTRAINT [IF EXISTS] cons_name;

警告

  • B模式中ALTER TABLE DROP INDEX|KEY 只支持单语句, 不支持和其他的修改项组合起来使用

GaussDB MySQL 505.2 版本 B模式 示例

-- 转换前
alter table t1 drop constraint primary key;
alter table t1 drop primary key;
alter table t1 drop index idx_123;
alter table t1 drop key idx_123;
alter table t1 drop index if exists idx_123;
alter table t1 drop key if exists idx_123;
alter table t1 drop constraint cons_123;
alter table t1 drop constraint if exists cons_123;


-- 转换后
ALTER TABLE `t1` DROP PRIMARY KEY;
ALTER TABLE `t1` DROP PRIMARY KEY;
DROP INDEX `idx_123`;
DROP INDEX `idx_123`;
DROP INDEX IF EXISTS `idx_123`;
DROP INDEX IF EXISTS `idx_123`;
ALTER TABLE `t1` DROP CONSTRAINT `cons_123`;
ALTER TABLE `t1` DROP CONSTRAINT IF EXISTS `cons_123`;