文档主页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  NDB Cluster 中的 SQL 语法不兼容性

25.2.7.1 NDB Cluster 中的 SQL 语法不兼容性

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

  • 临时表。 临时表不受支持。尝试创建使用 NDB 存储引擎的临时表,或将现有的临时表更改为使用 NDB 会导致以下错误:表存储引擎 'ndbcluster' 不支持创建选项 'TEMPORARY'.

  • NDB 表中的索引和键。 NDB Cluster 表上的键和索引受到以下限制

    • 列宽度。 尝试在 NDB 表列上创建索引,该列的宽度大于 3072 字节,会被拒绝,并显示错误 ER_TOO_LONG_KEY指定的键过长;最大键长度为 3072 字节.

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

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

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

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

    • 使用 HASH 键和 NULL。 在唯一键和主键中使用可空列意味着使用这些列的查询将被视为完整表扫描。为了解决此问题,请将列设为 NOT NULL,或在没有 USING HASH 选项的情况下重新创建索引。

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

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

    • 每个作为外键引用的列都需要一个显式唯一键,前提是它不是表的主键。

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

      这是因为主键的更新实现为删除旧行(包含旧主键)以及插入新行(使用新主键)。NDB 内核无法看到这一点,它将这两行视为相同,因此无法知道此更新应该级联。

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

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

    • NO ACTION 关键字被接受,但被视为 RESTRICTNO ACTION 是一个标准 SQL 关键字,在 MySQL 8.4 中是默认值。(与 InnoDB 相同。)

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

    有关更多信息,请参阅 第 15.1.20.5 节,"FOREIGN KEY 约束" 以及 第 1.7.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 分区。在 CREATE TABLE 语句中使用任何其他分区类型以及 ENGINE=NDBENGINE=NDBCLUSTER 会导致错误。

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

    默认分区方案。 所有 NDB Cluster 表默认使用 KEY 进行分区,使用表的 主键作为分区键。如果未为表显式设置主键,则会使用 NDB 存储引擎自动创建的 隐藏 主键。有关这些问题和其他相关问题的更多讨论,请参阅 第 26.2.5 节,"KEY 分区"

    CREATE TABLEALTER TABLE 语句会导致用户分区 NDBCLUSTER 表不满足以下两个要求中的一个或两个,则不允许,并会显示错误

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

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

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

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

    不支持 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.4 附带的 mysqld 中受 NDB 表支持。

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

    NDB API 没有为处理 JSON 数据提供任何特殊配置,它将 JSON 数据简单地视为 BLOB 数据。应用程序必须处理 JSON 数据。