文档主页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
信息 (Gzip) - 4.0Mb
信息 (Zip) - 4.0Mb


MySQL 9.0 参考手册  /  ...  /  NDB 集群中不符合 SQL 语法的部分

25.2.7.1 NDB 集群中不符合 SQL 语法的部分

如下列列表所示,与某些 MySQL 功能相关的某些 SQL 语句在与 NDB 表一起使用时会产生错误。

  • 临时表。  不支持临时表。尝试创建使用 NDB 存储引擎的临时表或更改现有临时表以使用 NDB 会失败,并出现错误 表存储引擎 'ndbcluster' 不支持创建选项 'TEMPORARY'

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

    • 列宽。  尝试在宽度大于 3072 字节的 NDB 表列上创建索引将被拒绝,并出现 ER_TOO_LONG_KEY 错误:指定的键太长;最大键长度为 3072 字节

      尝试在宽度大于 3056 字节的 NDB 表列上创建索引将成功,但会发出警告。在这种情况下,不会生成统计信息,这意味着可能会选择非最佳执行计划。因此,如果可能,您应该考虑使索引长度小于 3056 字节。

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

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

      但是,您可以在 NDB 表的 VARCHAR 列上创建索引。

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

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

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

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

      以下 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 9.0 中对外键约束的支持与 InnoDB 提供的支持相当,但受以下限制:

    • 如果作为外键引用的每个列不是表的主键,则需要一个显式的唯一键。

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

      这是因为主键的更新是通过删除旧行(包含旧主键)以及插入新行(具有新主键)来实现的。这对 NDB 内核是不可见的,NDB 内核将这两行视为同一行,因此无法知道应将此更新级联。

    • 当子表包含一个或多个任何 TEXTBLOB 类型的列时,也不支持 ON DELETE CASCADE。(错误号 #89511,错误号 #27484882)

    • 不支持 SET DEFAULT。(InnoDB 也不支持。)

    • 接受 NO ACTION 关键字,但将其视为 RESTRICT。标准 SQL 关键字 NO ACTION 在 MySQL 9.0 中是默认设置。(与 InnoDB 相同。)

    • 在早期版本的 NDB 集群中,当使用外键创建表以引用另一个表中的索引时,即使索引中的列顺序不匹配,有时似乎也可以创建外键,因为在内部并不总是返回适当的错误。对此问题的部分修复改进了在内部使用的错误,使其在大多数情况下都能正常工作;但是,如果父索引是唯一索引,则仍然可能出现这种情况。(错误号 #18094360)

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

  • NDB 集群和几何数据类型。  NDB 表支持几何数据类型(WKTWKB)。但是,不支持空间索引。

  • 字符集和二进制日志文件。  当前,ndb_apply_statusndb_binlog_index 表是使用 latin1(ASCII)字符集创建的。因为二进制日志的名称记录在此表中,所以使用非拉丁字符命名的二进制日志文件无法在这些表中正确引用。这是一个已知问题,我们正在努力解决。(错误号 #50226)

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

  • 使用用户定义的分区创建 NDB 表。  对 NDB 集群中用户定义的分区的支持仅限于 [LINEAR] KEY 分区。在 CREATE TABLE 语句中将任何其他分区类型与 ENGINE=NDBENGINE=NDBCLUSTER 一起使用会导致错误。

    可以覆盖此限制,但不支持在生产环境中这样做。有关详细信息,请参阅 用户定义的分区和 NDB 存储引擎(NDB 集群)

    默认分区方案。  默认情况下,所有 NDB 集群表都通过 KEY 进行分区,使用表的主键作为分区键。如果没有为表显式设置主键,则使用由 NDB 存储引擎自动创建的“隐藏”主键。有关这些问题和相关问题的其他讨论,请参阅 第 26.2.5 节 “KEY 分区”

    导致用户分区 NDBCLUSTER 表不满足以下两个要求之一或两者的 CREATE TABLEALTER TABLE 语句是不允许的,并且会失败并出现错误:

    1. 该表必须具有显式主键。

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

    例外。  如果使用空列列表(即,使用 PARTITION BY [LINEAR] KEY())创建用户分区 NDBCLUSTER 表,则不需要显式主键。

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

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

    分区选择。 NDB 表不支持分区选择。有关更多信息,请参阅第 26.5 节“分区选择”

  • JSON 数据类型。 NDB 9.0 附带的 mysqld 支持 NDB 表的 MySQL JSON 数据类型。

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

    NDB API 没有专门用于处理 JSON 数据的规定,它只是将 JSON 数据视为 BLOB 数据。将数据作为 JSON 处理必须由应用程序执行。