Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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

25.2.7.1 NDB 集群中不符合 SQL 语法的行为

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

  • 临时表.  临时表不受支持。尝试创建使用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 存储引擎不支持MyISAMInnoDB表的FULLTEXT索引。

      然而,您可以在VARCHAR列上创建索引的NDB表中。

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

    • 前缀.  没有前缀索引,只能对整个列进行索引。(NDB 列索引的大小总是与列宽(以字节为单位)相同,直到包括 3072 字节,详见本节早期部分。另外,请参阅第25.2.7.6节,“NDB 集群中不支持或缺失的特性”,了解更多信息。)

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

    • AUTO_INCREMENT 列.  就像其他 MySQL 存储引擎一样,AUTO_INCREMENT 列,并且这个列必须是索引。然而,在没有明确主键的 NDB 表中,AUTO_INCREMENT 列将被自动定义并用作隐藏的主键。因此,你不能创建一个没有明确主键的 NDB 表,同时包含 AUTO_INCREMENT 列。

      以下以下语句创建了一个主键、AUTO_INCREMENT 列和对该列的索引,并成功执行:

      # 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

      The following statement creates a table with a primary key, an AUTO_INCREMENT column, and an index on this column, and succeeds:

      # 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.4 中的外键约束支持与InnoDB相似,但受以下限制:

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

    • ON UPDATE CASCADE 在引用父表的主键时不受支持。

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

    • ON DELETE CASCADE 在子表中包含任何 TEXT 或 BLOB 类型的列时不受支持。 (Bug #89511, Bug #27484882)

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

    • 关键字 NO ACTION 被接受,但被视为 RESTRICTNO ACTION 是 MySQL 8.4 的默认值,也是与InnoDB相同的行为。

    • 在 NDB 集群的早期版本中,当创建一个引用另一个表中的索引的外键时,可能会出现情况,即使索引列的顺序不匹配,因为内部没有总是返回错误。部分解决方案改进了内部错误,以便在大多数情况下工作;然而,在父索引为唯一索引的情况下,这种情况仍然可能发生。 (Bug #18094360)

    更多信息,请见第15.1.20.5节,“FOREIGN KEY Constraints”第1.7.3.2节,“FOREIGN KEY Constraints”

  • NDB 集群和几何数据类型. 几何数据类型(WKTWKB)支持在NDB表中使用。然而,空间索引不受支持。

  • 字符集和二进制日志文件. 当前,ndb_apply_statusndb_binlog_index 表使用了 latin1(ASCII) 字符集。由于这些表中记录的二进制日志文件名是以 ASCII 字符集编码的,因此使用非 Latin 字符编码的二进制日志文件在这些表中无法正确引用。这是一个已知的问题,我们正在努力解决。 (Bug #50226)

    为了解决这个问题,可以在命名二进制日志文件或设置--basedir--log-bin--log-bin-index选项时,只使用Latin-1字符。

  • NDB表的自定义分区创建. 支持NDB集群中的自定义分区,但受限于[LINEAR] KEY分区类型。使用其他分区类型与CREATE TABLE语句中的ENGINE=NDBENGINE=NDBCLUSTER结果在错误。

    可以Override这个限制,但是在生产环境中不支持。详细信息请见NDB存储引擎中的自定义分区(NDB集群)

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

    CREATE TABLEALTER TABLE语句,如果将导致用户分区的 NDBCLUSTER 表不满足以下两个要求中的任何一个或两个,将被拒绝,并且会出现错误:

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

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

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

    NDBCLUSTER 表的最大分区数.  在使用自定义分区时,NDBCLUSTER 表最多可以定义8个分区per node group。 (请参阅第25.2.2节,“NDB Cluster Nodes, Node Groups, Fragment Replicas, and Partitions”,了解更多关于 NDB Cluster node groups 的信息。

    不支持DROP PARTITION.  不能使用ALTER TABLE ... DROP PARTITIONNDB表中删除分区。其他对ALTER TABLE的扩展—ADD PARTITIONREORGANIZE PARTITIONCOALESCE PARTITION—对于 NDB 表是支持的,但使用复制操作,因此不优化。请参阅第26.3.1节,“Management of RANGE and LIST Partitions”第15.1.9节,“ALTER TABLE Statement”

    分区选择.  对于NDB表,分区选择不支持。请参阅第26.5节,“Partition Selection”,了解更多信息。

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

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

    NDB API 没有特殊的处理方式来工作于 JSON 数据,它将其视为简单的 BLOB 数据。应用程序需要负责处理数据作为 JSON