约束和索引操作

本文为您介绍迁移 MySQL 数据库的数据至 OceanBase 数据库 MySQL 租户时,ALTER TABLE DDL 有关约束/索引操作同步支持的范围。

总览

alter_option: {
   ADD {INDEX | KEY} [index_name]
        [index_type] (key_part,...) [index_option] ...
  | ADD {FULLTEXT | SPATIAL} [INDEX | KEY] [index_name]
        (key_part,...) [index_option] ...
  | ADD [CONSTRAINT [symbol]] PRIMARY KEY
        [index_type] (key_part,...)
        [index_option] ...
  | ADD [CONSTRAINT [symbol]] UNIQUE [INDEX | KEY]
        [index_name] [index_type] (key_part,...)
        [index_option] ...
  | ADD [CONSTRAINT [symbol]] FOREIGN KEY
        [index_name] (col_name,...)
        reference_definition
  | ADD [CONSTRAINT [symbol]] CHECK (expr) [[NOT] ENFORCED]
  | DROP {CHECK | CONSTRAINT} symbol
  | ALTER {CHECK | CONSTRAINT} symbol [NOT] ENFORCED
  | ALTER INDEX index_name {VISIBLE | INVISIBLE}
  | {DISABLE | ENABLE} KEYS
  | DROP {INDEX | KEY} index_name
  | DROP PRIMARY KEY
  | DROP FOREIGN KEY fk_symbol
  | RENAME {INDEX | KEY} old_index_name TO new_index_name
}

key_part: {col_name [(length)] | (expr)} [ASC | DESC]

index_type:
    USING {BTREE | HASH}

index_option: {
    KEY_BLOCK_SIZE [=] value
  | index_type
  | WITH PARSER parser_name
  | COMMENT 'string'
  | {VISIBLE | INVISIBLE}
}

支持的范围

  • 支持创建普通索引:ADD INDEX / KEY

  • 支持删除索引:DROP INDEX

  • 支持创建全文索引:ADD FULLTEXT INDEX / KEY

  • 支持创建唯一索引:ADD UNIQUE INDEX / KEY

  • 支持创建外键 ADD:FOREIGN KEY

  • 支持删除主键约束: DROP PRIMARY KEY

    重要

    仅 OceanBase 数据库 4.0.0 及以上版本支持。

不支持的范围

重要

如果同步的 DDL 包含以下不支持的定义,则整个建表语句会转换失败(输出空)。

  • UNIQUE KEY、INDEX / KEY、FULLTEXT INDEX 不支持函数索引,仅支持索引创建在字段上。

  • 不支持 ADD SPATIAL INDEX

  • 不支持 ADD PRIMARY KEY

  • 不支持 ALTER TABLE DISABLE | ENABLE KEYS

  • 不支持 FOREIGN KEY 指定 ON [DELETE | UPDATE] SET NULL 属性。

  • OceanBase 数据库 MySQL 租户 3.2.3 以下版本,不支持下述操作:

    • 不支持 ADD CHECK

    • 不支持 DROP CHECK

    • 不支持 ALTER CHECK [NOT] ENFORCED

    • 不支持 ALTER INDEX VISIBLE | INVISIBLE

    • 不支持 RENAME INDEX / KEY

      ALTER TABLE t rename KEY k TO kk;
      ALTER TABLE T RENAME INDEX b TO w;

忽略的属性

重要

如果同步的 DDL 包含以下不支持的定义,则这些属性将不会被解析和转换,最终会被忽略。

  • 指定 USING BTREEUSING HASH

  • index option 中指定 KEY_BLOCK_SIZEindex_typeWITH PARSERCOMMENTVISIBLE | INVISIBLEENGINE_ATTRIBUTESECONDARY_ENGINE_ATTRIBUTE 属性。

  • CHECK 约束中指定 [NOT] ENFORCED 属性。

  • FOREIGN KEY 指定 MATCH FULL | MATCH PARTIAL | MATCH SIMPLE 属性。

使用限制

重要

由于 OceanBase 数据库 MySQL 租户本身的限制,如果存在以下场景,同步的 DDL 被成功转换后,执行到 OceanBase 数据库 MySQL 租户可能会报错。

  • OceanBase 数据库 MySQL 租户不支持 PRIMARY KEY、UNIQUE KEY、INDEX / KEY、FULLTEXT INDEX、FOREIGN KEY 创建在某些类型的字段上。

  • OceanBase 数据库 MySQL 租户不支持 CHECK 约束中的某些函数/表达式。

  • OceanBase 数据库 MySQL 租户不支持 FOREIGN KEY 约束中的某些函数/表达式。