更新时间:2024-11-11 GMT+08:00

DDL

表1 DDL语法兼容介绍

序号

概述

详细语法说明

差异

1

建表和修改表时支持创建主键、UNIQUE索引

ALTER TABLE、CREATE TABLE

  • GaussDB当前不支持UNIQUE INDEX|KEY index_name语法,使用UNIQUE INDEX|KEY index_name语法时会报错。MySQL支持。
  • 当约束被建立为全局二级索引,SQL语句中指定using btree时,底层会建立为ubtree。
  • 当约束关联的表为ustore,且SQL语句中指定为using btree时,底层会建立为ubtree。

2

支持前缀索引

CREATE INDEX

  • 前缀长度不得超过2676,键值的实际长度受内部页面限制,若字段中含有多字节字符或者一个索引上有多个键,索引行长度可能会超限报错。
  • CREATE INDEX语法中,不支持以下关键字作为前缀键的字段名称:COALESCE、EXTRACT、GREATEST、LEAST、LNNVL、NULLIF、NVL、NVL2、OVERLAY、POSITION、REGEXP_LIKE、SUBSTRING、TIMESTAMPDIFF、TREAT、TRIM、XMLCONCAT、XMLELEMENT、XMLEXISTS、XMLFOREST、XMLPARSE、XMLPI、XMLROOT、XMLSERIALIZE。
  • 主键和唯一键索引中不支持前缀键。

3

支持指定字符集与排序规则

ALTER SCHEMA、ALTER TABLE、

CREATE SCHEMA、CREATE TABLE

-

4

创建分区表语法兼容

CREATE TABLE PARTITION

-

5

建表和修改表时支持指定表级和列级comment

CREATE TABLE、ALTER TABLE

-

6

创建索引时支持指定索引级comment

CREATE INDEX

-

7

交换普通表和分区表分区的数据

ALTER TABLE PARTITION

ALTER TABLE EXCHANGE PARTITION的差异点:

  • MySQL表或分区使用tablespace时,则无法进行分区和普通表数据的交换;GaussDB表或分区使用不同的tablespace时,仍可进行分区和普通表数据的交换。
  • 对于列默认值,MySQL不会校验默认值,因此默认值不同时也可进行分区和普通表数据的交换;GaussDB会校验默认值,如果默认值不同,则无法进行分区和普通表数据的交换。
  • MySQL在分区表或普通表上进行DROP列操作后,表结构仍然一致,则可进行分区和普通表数据的交换;GaussDB需要保证普通表和分区表的被删除列严格对齐才能进行分区和普通表数据的交换。
  • MySQL和GaussDB的哈希算法不同,所以两者在相同的hash分区存储的数据可能不一致,导致最后交换的数据也可能不一致。
  • MySQL的分区表不支持外键,普通表包含外键或其他表引用普通表的外键,则无法进行分区和普通表数据的交换;GaussDB的分区表支持外键,在两个表的外键约束一致时,则可进行分区和普通表数据的交换;GaussDB的分区表不带外键,普通表有其他表引用,如果分区表和普通表表一致,则可进行分区和普通表数据的交换。

8

支持自增列

ALTER TABLE、CREATE TABLE

  • 目前仅支持各个DN独立自增的本地自动增长列。
  • 自动增长列建议为索引(非全局二级索引)的第一个字段,否则建表时产生警告,含有自动增长列的表进行某些操作时会产生错误,例如:ALTERT TABLE EXCHANGE PARTITION。MySQL自动增长列必须为索引第一个字段。
  • AUTO_INCREMENT = value语法,value必须为小于2^127的正数。MySQL不校验value。
  • 当自增值已经达到字段数据类型的最大值时,继续自增将产生错误。MySQL有些场景产生错误或警告,有些场景仍自增为最大值。
  • 不支持innodb_autoinc_lock_mode系统变量,GaussDB的GUC参数auto_increment_cache=0时,批量插入自动增长列的行为与MySQL系统变量innodb_autoinc_lock_mode=1相似。
  • 自动增长列在导入数据或者进行Batch Insert执行计划的插入操作时,对于混合0、NULL和确定值的场景,如果产生错误,后续插入自增值不一定与MySQL完全一致。
    • 提供auto_increment_cache参数,可以控制预留自增值的数量。
  • 批量插入在不同执行计划下,自增的顺序、自增值预留数量可能与MySQL不完全相同。例如:“INSERT INTO table VALUES(...),(...),...”由于要分布到不同DN,在某些执行计划中,DN获取不到即将插入的行数。
    • 提供auto_increment_cache参数,可以控制预留自增值的数量。
  • 并行导入或插入自动增长列触发自增时,每个并行线程预留的缓存值也只在其线程中使用,未完全使用完毕的话,也会出现表中自动增长列的值不连续的情况。并行插入产生的自增值结果无法保证与MySQL完全一致。
  • SERIAL数据类型为原有的自增列,与AUTO_INCREMENT自增列有差异。MySQL的SERIAL数据类型就是AUTO_INCREMENT自增列。
  • 不允许auto_increment_offset的值大于auto_increment_increment的值,会产生错误。MySQL允许,并说明auto_increment_offset会被忽略。
  • 在表有主键或索引的情况下,ALTER TABLE命令重写表数据的顺序与MySQL不一定相同,GaussDB按表数据存储顺序重写,MySQL会按主键或索引顺序重写,导致自增值的顺序可能不同。
  • ALTER TABLE命令添加或修改自增列时,第一次预留自增值的数量是表统计信息中的行数,统计信息的行数不一定与MySQL一致。
  • 在触发器或用户自定义函数中自增时,刷新last_insert_id返回值。MySQL不刷新。
  • 对GUC参数auto_increment_offset和auto_increment_increment设置超出范围的值会产生错误。MySQL会自动改为边界值。
  • 暂不支持last_insert_id函数。
  • 本地临时表暂不支持自动增长列。
  • sql_mode设置no_auto_value_on_zero参数,表定义的自动增长列为非NOT NULL约束,向表中插入数据不指定自动增长列的值时,GaussDB中自动增长列插入NULL值,且不触发自增;MySQL中自动增长列插入NULL值,触发自增。

9

支持删除表的主键约束

ALTER TABLE

-

10

支持CREATE TABLE ... LIKE语法兼容

CREATE TABLE ... LIKE

  • 在MySQL 8.0.16 之前的版本中,CHECK约束会被语法解析但功能会被忽略,表现为不复制CHECK约束,GaussDB支持复制CHECK约束。
  • 对于set数据类型,在建表时,MySQL支持复制,GaussDB不支持复制。
  • 对于主键约束名称,在建表时,MySQL所有主键约束名称固定为PRIMARY KEY,GaussDB不支持复制。
  • 对于唯一键约束名称,在建表时,MySQL支持复制,GaussDB不支持复制。
  • 对于CHECK约束名称,在建表时,MySQL 8.0.16 之前的版本无CHECK约束信息,GaussDB支持复制。
  • 对于索引名称,在建表时,MySQL支持复制,GaussDB不支持复制。
  • 在跨sql_mode模式建表时,MySQL受宽松模式和严格模式控制,GaussDB可能存在严格模式失效的情况。

    例如:源表存在默认值“0000-00-00”,在“no_zero_date”严格模式下,GaussDB建表成功,且包含默认值“0000-00-00”,严格模式失效;而MySQL建表失败,受严格模式控制。

  • 针对跨数据库创建表,MySQL支持,GaussDB不支持。
  • 针对源表为临时表,创建非临时表,MySQL支持,GaussDB不支持。

11

支持更改表名兼容语法

ALTER TABLE[ IF EXISTS ] tbl_name RENAME [TO | AS | =] new_tbl_name;

RENAME {TABLE | TABLES} tbl_name TO new_tbl_name [, tbl_name2 TO new_tbl_name2, ...];

  • GaussDB的alter rename语法仅支持修改表名称功能操作,不能耦合其它功能操作;
  • GaussDB的仅旧表名字段支持如schema.table_name用法;且新表名与旧表名将属于同一Schema下;
  • GaussDB的不支持新旧表跨Schema重命名操作;但如有权限,则可在当前Schema下修改其它Schema下表名称;
  • GaussDB的rename多组表的语法支持全为本地临时表的重命名,不支持本地临时表和非本地临时表组合的场景。

12

支持增加子分区语法兼容

ALTER TABLE [ IF EXISTS ] { table_name [*] | ONLY table_name | ONLY ( table_name )}

action [, ... ];

action:

move_clause |

exchange_clause |

row_clause |

merge_clause |

modify_clause |

split_clause |

add_clause |

drop_clause |

ilm_clause

add_clause:

ADD {{partition_less_than_item | partition_start_end_item | partition_list_item} |

PARTITION({partition_less_than_item | partition_start_end_item | partition_list_item})}

  • 不支持ALTER TABLE table_name ADD PARTITION (partition_definition1, partition_definition1,…);语法添加多分区。
  • 仅支持原有添加多分区语法:ALTER TABLE table_name ADD PARTITION (partition_definition1), ADD PARTITION (partition_definition2[y1] ), …;。