• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • NDB群集中不符合SQL语法

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

    • 临时表。不支持临时表。尝试创建使用NDB存储引擎的临时表或更改现有的临时表使用NDB失败,并显示错误表存储引擎“ ndbcluster”,不支持创建选项“ TEMPORARY”。
    • NDB表中的索引和键。 NDB群集表上的键和索引受以下限制:

      • 列宽。尝试在NDB宽度大于3072字节的表列上创建索引成功,但是实际上只有前3072个字节用于索引。在这种情况下,警告“指定密钥”太长;发出最大密钥长度为3072字节,并且一条SHOW CREATE TABLE语句显示索引的长度为3072。
      • TEXT和BLOB列。您不能在NDB使用任何TEXTBLOB数据类型的表列上创建索引。
      • FULLTEXT索引。NDB存储引擎不支持FULLTEXT索引,这是可能的MyISAMInnoDB唯一的表。

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

      • 使用HASH键和NULL。在唯一键和主键中使用可为空的列意味着使用这些列的查询被视为全表扫描。要变通解决此问题,使列NOT NULL,或重新创建索引,而无需使用该USING HASH选项。
      • 前缀。没有前缀索引;只能对整个列建立索引。(如NDB本节前面所述,列索引的大小始终与列的宽度相同,以字节为单位,最大为3072字节,包括3072字节。另请参见“ NDB群集中不受支持或缺少的功能”,以获取更多信息。)
      • BIT列。BIT列不能是一个主键,唯一键,或指数,也不能是复合主键,唯一键,或索引的一部分。
      • AUTO_INCREMENT列。像其他MySQL存储引擎一样,每个表NDB最多可以处理一AUTO_INCREMENT列。但是,对于没有显式主键的NDB表,将AUTO_INCREMENT自动定义一列并将其用作“隐藏”主键。因此,您不能定义具有显式AUTO_INCREMENT列的表,除非也使用PRIMARY KEY选项声明了该列。尝试使用AUTO_INCREMENT不是表的主键的列,并且使用NDB存储引擎失败,并显示错误。
    • 外键限制。 NDB 8.0中对外键约束的支持与所提供的相当InnoDB,但受到以下限制:

      • 如果不是表的主键,则引用为外键的每一列都需要一个显式的唯一键。
      • ON UPDATE CASCADE当引用是父表的主键时,不支持此功能。

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

      • 从NDB 8.0.16开始:ON DELETE CASCADE在子表包含一个或多个任何TEXTBLOB类型的列时,不支持。(缺陷#89511,错误#27484882)
      • SET DEFAULT不支持。(也不支持InnoDB。)
      • NO ACTION关键字被接受,但作为治疗RESTRICTNO ACTION,这是标准的SQL关键字,是MySQL 8.0的默认设置。(与相同InnoDB。)
      • 在NDB Cluster的早期版本中,当创建带有外键引用另一个表中的索引的表时,有时即使索引中各列的顺序不匹配,也可以创建外键。并非总是在内部返回适当的错误。此问题的部分修复改善了大多数情况下内部使用的错误;但是,如果父索引是唯一索引,则这种情况仍然有可能发生。(缺陷号18094360)

      有关更多信息,请参见“ FOREIGN KEY约束”和“ FOREIGN KEY约束”。

    • NDB群集和几何数据类型。表支持几何数据类型(WKTWKBNDB。但是,不支持空间索引。
    • 字符集和二进制日志文件。当前,ndb_apply_statusndb_binlog_index表是使用latin1(ASCII)字符集创建的。因为二进制日志的名称记录在此表中,所以在这些表中未正确引用使用非拉丁字符命名的二进制日志文件。这是一个已知问题,我们正在努力解决。错误35226)

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

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

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

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

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

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

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

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

      不支持DROP PARTITION。无法NDB使用从表中删除分区ALTER TABLE ... DROP PARTITION。其他分区扩展ALTER TABLE-ADD PARTITIONREORGANIZE PARTITIONCOALESCE PARTITION-are支持NDB表,但使用复制,因此不进行优化。请参见“ RANGE和LIST分区的管理”和“ ALTER TABLE语句”。

    • 基于行的复制。在NDB群集中使用基于行的复制时,不能禁用二进制日志记录。也就是说,NDB存储引擎将忽略的值sql_log_bin
    • JSON数据类型。NDB 8.0随附的mysqld中的JSON支持 MySQL 数据类型。NDB

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

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