Documentation Home

23.2.7.1 NDB Cluster 中不符合 SQL 语法

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

  • 临时表。  不支持临时表。尝试创建使用 NDB存储引擎的临时表或更改现有临时表以使用 NDB失败并出现错误 Table storage engine 'ndbcluster' does not support the create option 'TEMPORARY'

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

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

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

    • 全文索引。 NDB存储引擎不支持索引 ,索引只能FULLTEXT用于 MyISAMInnoDB表。

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

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

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

    • 位列。 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.0 对外键约束的支持与 提供的相当 InnoDB,受以下限制:

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

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

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

    • ON DELETE CASCADETEXT在子表包含任何或 BLOB类型的一个或多个列的情况下也不支持 。(漏洞 #89511,漏洞 #27484882)

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

    • 关键字被接受但被NO ACTION视为RESTRICT. NO ACTION,这是一个标准的 SQL 关键字,在 MySQL 8.0 中是默认的。(也与 . 相同InnoDB。)

    • 在 NDB Cluster 的早期版本中,当使用外键引用另一个表中的索引创建表时,有时即使索引中列的顺序不匹配,也可能创建外键,因为内部并不总是返回适当的错误。在大多数情况下,针对此问题的部分修复改进了内部使用的错误;但是,如果父索引是唯一索引,这种情况仍有可能发生。(缺陷号 18094360)

    有关详细信息,请参阅 第 13.1.20.5 节,“外键约束”第 1.7.3.2 节,“外键约束”

  • NDB Cluster 和几何数据类型。 表格支持 几何数据类型(WKT和 )。但是,不支持空间索引。 WKBNDB

  • 字符集和二进制日志文件。  目前,ndb_apply_statusndb_binlog_index表是使用latin1(ASCII) 字符集创建的。由于此表中记录了二进制日志的名称,因此这些表中未正确引用使用非拉丁字符命名的二进制日志文件。这是一个已知问题,我们正在努力解决。(漏洞 #50226)

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

  • 使用用户定义的分区创建 NDB 表。  NDB Cluster 中对用户定义分区的支持仅限于 [ LINEAR] KEY分区。在 语句中ENGINE=NDB或 语句中使用任何其他分区类型会导致错误。 ENGINE=NDBCLUSTERCREATE TABLE

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

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

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

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

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

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

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

    不支持删除分区。  无法使用 删除 NDB表中 的分区ALTER TABLE ... DROP PARTITION。NDB 表支持ALTER TABLEADD PARTITIONREORGANIZE PARTITION和 —的其他分区扩展 ,但使用复制,因此未优化。COALESCE PARTITION请参阅第 24.3.1 节,“RANGE 和 LIST 分区的管理”第 13.1.9 节,“ALTER TABLE 语句”

    分区选择。  表不支持分区选择 NDB。有关详细信息,请参阅 第 24.5 节,“分区选择”

  • JSON 数据类型。 NDB 8.0 提供 的mysqld中的表 JSON支持 MySQL数据类型。NDB

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

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