创建索引或约束

本文为您介绍迁移 MySQL 数据库的数据至 OceanBase 数据库 MySQL 租户时,CREATE TABLE DDL 创建索引或约束支持的转换范围。

索引或约束定义

create_definition: {
    col_name column_definition
  | {INDEX | KEY} [index_name] [index_type] (key_part,...)
      [index_option] ...
  | {FULLTEXT | SPATIAL} [INDEX | KEY] [index_name] (key_part,...)
      [index_option] ...
  | [CONSTRAINT [symbol]] PRIMARY KEY
      [index_type] (key_part,...)
      [index_option] ...
  | [CONSTRAINT [symbol]] UNIQUE [INDEX | KEY]
      [index_name] [index_type] (key_part,...)
      [index_option] ...
  | [CONSTRAINT [symbol]] FOREIGN KEY
      [index_name] (col_name,...)
      reference_definition
  | check_constraint_definition
}

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}
  |ENGINE_ATTRIBUTE [=] 'string'
  |SECONDARY_ENGINE_ATTRIBUTE [=] 'string'
}

check_constraint_definition:
    [CONSTRAINT [symbol]] CHECK (expr) [[NOT] ENFORCED]

reference_definition:
    REFERENCES tbl_name (key_part,...)
      [MATCH FULL | MATCH PARTIAL | MATCH SIMPLE]
      [ON DELETE reference_option]
      [ON UPDATE reference_option]

reference_option:
    RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT

支持的范围

  • 支持创建 PRIMARY KEY。

  • 支持创建 UNIQUE KEY。

  • 支持创建 INDEX / KEY。

  • 支持创建 FOREIGN KEY。

    支持 FOREIGN KEY 创建在字段/函数/表达式上,支持指定 ON [DELETE | UPDATE] RESTRICT | CASCADE | NO ACTION | SET DEFAULT 属性。

  • 支持创建 FULLTEXT INDEX。

  • OceanBase 数据库 MySQL 租户 3.2.3 及以上版本支持创建 CHECK 约束。

  • 支持前缀索引。

  • 支持指定 ASC / DESC。

不支持的范围

重要

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

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

    不支持 PRIMARY KEY、UNIQUE KEY、INDEX / KEY、FULLTEXT INDEX 定义中包含函数或表达式,示例如下:

    CREATE TABLE functional_index_t1 (col1 INT, PRIMARY KEY (col1, (ABS(col1))));
    CREATE TABLE functional_index_t1(x VARCHAR(30), INDEX idx ((CAST(x->>'$.name' AS CHAR(30)))));
  • 不支持创建 SPATIAL INDEX。

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

忽略的属性

说明

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

  • 指定 USING BTREE 或 USING HASH。

  • index option 中指定 KEY_BLOCK_SIZE、index_type、WITH PARSER、COMMENT、VISIBLE | INVISIBLE、ENGINE_ATTRIBUTE 和 SECONDARY_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 约束中的某些函数/表达式。