Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  Noncompliance with SQL Syntax in NDB Cluster

25.2.7.1 NDB 集群中 SQL 语法的非兼容性

某些与 MySQL 特性相关的 SQL 语句在使用 NDB 表时会产生错误,如下列表所示:

  • 临时表。 临时表不受支持。尝试创建一个使用 NDB 存储引擎的临时表或将现有的临时表修改为使用 NDB 都将失败,错误信息为 Table storage engine 'ndbcluster' does not support the create option 'TEMPORARY'

  • NDB 表中的索引和键。 NDB 集群表中的键和索引受以下限制:

    • 列宽度。 尝试在 NDB 表的列上创建索引,该列的宽度超过 3072 字节时,虽然创建索引成功,但只有前 3072 字节被实际用于索引。在这种情况下,会发出警告 Specified key was too long; max key length is 3072 bytes,并且 SHOW CREATE TABLE 语句将显示索引的长度为 3072。

    • TEXT 和 BLOB 列。 您不能在 NDB 表的列上创建索引,该列使用 TEXTBLOB 数据类型。

    • FULLTEXT 索引。 NDB 存储引擎不支持 FULLTEXT 索引,该功能仅适用于 MyISAMInnoDB 表。

      然而,您可以在 VARCHAR 列上创建索引,该列属于 NDB 表。

    • 使用 HASH 键和 NULL。 在唯一键和主键中使用可为空的列意味着使用这些列的查询将被处理为全表扫描。要解决这个问题,请将该列设置为 NOT NULL,或重新创建索引而不使用 USING HASH 选项。

    • 前缀。 没有前缀索引;只能对整个列进行索引。(NDB 列索引的大小始终等于该列的宽度,以字节为单位,最高达 3072 字节,如本节前面所述。另请参阅 第 25.2.7.6 节,“NDB 集群中不支持或缺失的功能”,以获取更多信息。)

    • BIT 列。 BIT 列不能作为主键、唯一键或索引,也不能作为复合主键、唯一键或索引的一部分。

    • AUTO_INCREMENT 列。 与其他 MySQL 存储引擎一样,NDB 存储引擎可以处理最多一个 AUTO_INCREMENT 列,该列必须被索引。然而,在没有明确主键的 NDB 表中,一个 AUTO_INCREMENT 列将自动定义并用作“隐藏”主键。因此,您不能创建一个 NDB 表,该表具有 AUTO_INCREMENT 列且没有明确主键。

      以下 CREATE TABLE 语句将不起作用,如下所示:

      # No index on AUTO_INCREMENT column; table has no primary key
      # Raises ER_WRONG_AUTO_KEY
      mysql> CREATE TABLE n (
          ->     a INT,
          ->     b INT AUTO_INCREMENT
          ->     )
          -> ENGINE=NDB;
      ERROR 1075 (42000): Incorrect table definition; there can be only one auto
      column and it must be defined as a key 
      
      # Index on AUTO_INCREMENT column; table has no primary key
      # Raises NDB error 4335
      mysql> CREATE TABLE n (
          ->     a INT,
          ->     b INT AUTO_INCREMENT,
          ->     KEY k (b)
          ->     )
          -> ENGINE=NDB;
      ERROR 1296 (HY000): Got error 4335 'Only one autoincrement column allowed per
      table. Having a table without primary key uses an autoincr' from NDBCLUSTER

      以下语句创建了一个表,该表具有主键、一个 AUTO_INCREMENT 列和该列上的索引,并且成功:

      # Index on AUTO_INCREMENT column; table has a primary key
      mysql> CREATE TABLE n (
          ->     a INT PRIMARY KEY,
          ->     b INT AUTO_INCREMENT,
          ->     KEY k (b)
          ->     )
          -> ENGINE=NDB;
      Query OK, 0 rows affected (0.38 sec)
  • 外键限制。 NDB 8.3 中的外键约束支持与 InnoDB 相似,subject to the following restrictions:

    • 每个作为外键引用的列都需要一个明确的唯一键,如果它不是表的主键。

    • ON UPDATE CASCADE 不支持当引用是到父表的主键时。

      这是因为主键的更新被实现为删除旧行(包含旧主键)加上插入新行(带有新主键)。这对 NDB 内核不可见,它将这两行视为相同的行,因此不知道该更新应该被级联。

    • ON DELETE CASCADE 也不支持在子表包含一个或多个 TEXTBLOB 类型的列时。(Bug #89511, Bug #27484882)

    • SET DEFAULT 不支持。(同样不支持 InnoDB。)

    • 关键字 NO ACTION 被接受,但被视为 RESTRICTNO ACTION 是标准 SQL 关键字,是 MySQL 8.3 的默认值。(同样适用于 InnoDB。)

    • 在早期版本的 NDB Cluster 中,当创建一个表具有外键引用另一个表的索引时,有时似乎可以创建外键,即使索引中的列顺序不匹配,这是因为内部错误没有被正确返回。(Bug #18094360)

    有关更多信息,请参阅 第 15.1.20.5 节,“FOREIGN KEY 约束”第 1.6.3.2 节,“FOREIGN KEY 约束”

  • NDB Cluster 和几何数据类型。  几何数据类型 (WKTWKB) 支持 NDB 表。然而,空间索引不支持。

  • 字符集和二进制日志文件。  目前,ndb_apply_statusndb_binlog_index 表是使用 latin1(ASCII)字符集创建的。因为二进制日志文件的名称记录在这个表中,使用非拉丁字符命名的二进制日志文件在这些表中没有正确引用。(Bug #50226)

    要解决这个问题,请在命名二进制日志文件或设置任何 --basedir--log-bin--log-bin-index 选项时仅使用拉丁-1 字符。

  • 创建 NDB 表具有用户定义的分区。  NDB Cluster 中的用户定义分区支持仅限于 [LINEAR] KEY 分区。使用 ENGINE=NDBENGINE=NDBCLUSTERCREATE TABLE 语句中,结果将出错。

    可以 override 这个限制,但是在生产设置中不支持使用。有关详细信息,请参阅 用户定义分区和 NDB 存储引擎 (NDB Cluster)

    默认分区方案。  所有 NDB Cluster 表默认使用 KEY 分区,使用表的主键作为分区键。如果表没有明确设置主键,NDB 存储引擎自动创建的“隐藏”主键将被使用。有关这些和相关问题的讨论,请参阅 第 26.2.5 节,“KEY Partitioning”

    CREATE TABLEALTER TABLE 语句,如果导致用户分区的 NDBCLUSTER 表不满足以下两个要求之一,将不被允许,并将以错误形式失败:

    1. 表必须有一个明确的主键。

    2. 所有列在表的分区表达式中必须是主键的一部分。

    例外。 如果用户分区的 NDBCLUSTER 表使用空列列表创建(即使用 PARTITION BY [LINEAR] KEY()),那么不需要明确的主键。

    NDBCLUSTER 表的最大分区数。 使用用户定义的分区时,NDBCLUSTER 表每个节点组最多可以定义 8 个分区。(请参阅 第 25.2.2 节,“NDB 集群节点、节点组、碎片副本和分区”,以获取更多关于 NDB 集群节点组的信息。

    不支持 DROP PARTITION。 无法使用 ALTER TABLE ... DROP PARTITIONNDB 表中删除分区。其他分区扩展到 ALTER TABLE —— ADD PARTITIONREORGANIZE PARTITIONCOALESCE PARTITION —— 对 NDB 表是支持的,但使用复制因此不是优化的。请参阅 第 26.3.1 节,“RANGE 和 LIST 分区管理”第 15.1.9 节,“ALTER TABLE 语句”

    分区选择。 不支持 NDB 表的分区选择。请参阅 第 26.5 节,“分区选择”,以获取更多信息。

  • JSON 数据类型。 MySQL JSON 数据类型在 NDB 8.3 中的 mysqld 中支持 NDB 表。

    一个 NDB 表最多可以有 3 个 JSON 列。

    NDB API 没有特殊的 JSON 数据处理机制,将其视为 BLOB 数据。应用程序必须处理 JSON 数据。