如下列列表所示,与某些 MySQL 功能相关的某些 SQL 语句在与 NDB
表一起使用时会产生错误。
临时表。 不支持临时表。尝试创建使用
NDB
存储引擎的临时表或更改现有临时表以使用NDB
会失败,并出现错误 表存储引擎 'ndbcluster' 不支持创建选项 'TEMPORARY'。NDB 表中的索引和键。 NDB 集群表上的键和索引受以下限制:
列宽。 尝试在宽度大于 3072 字节的
NDB
表列上创建索引将被拒绝,并出现ER_TOO_LONG_KEY
错误:指定的键太长;最大键长度为 3072 字节。尝试在宽度大于 3056 字节的
NDB
表列上创建索引将成功,但会发出警告。在这种情况下,不会生成统计信息,这意味着可能会选择非最佳执行计划。因此,如果可能,您应该考虑使索引长度小于 3056 字节。FULLTEXT 索引。
NDB
存储引擎不支持FULLTEXT
索引,这仅适用于MyISAM
和InnoDB
表。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
内核将这两行视为同一行,因此无法知道应将此更新级联。当子表包含一个或多个任何
TEXT
或BLOB
类型的列时,也不支持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
表支持几何数据类型(WKT
和WKB
)。但是,不支持空间索引。字符集和二进制日志文件。 当前,
ndb_apply_status
和ndb_binlog_index
表是使用latin1
(ASCII)字符集创建的。因为二进制日志的名称记录在此表中,所以使用非拉丁字符命名的二进制日志文件无法在这些表中正确引用。这是一个已知问题,我们正在努力解决。(错误号 #50226)要解决此问题,请在命名二进制日志文件或设置任何
--basedir
、--log-bin
或--log-bin-index
选项时,仅使用 Latin-1 字符。使用用户定义的分区创建 NDB 表。 对 NDB 集群中用户定义的分区的支持仅限于 [
LINEAR
]KEY
分区。在CREATE TABLE
语句中将任何其他分区类型与ENGINE=NDB
或ENGINE=NDBCLUSTER
一起使用会导致错误。可以覆盖此限制,但不支持在生产环境中这样做。有关详细信息,请参阅 用户定义的分区和 NDB 存储引擎(NDB 集群)。
默认分区方案。 默认情况下,所有 NDB 集群表都通过
KEY
进行分区,使用表的主键作为分区键。如果没有为表显式设置主键,则使用由NDB
存储引擎自动创建的““隐藏””主键。有关这些问题和相关问题的其他讨论,请参阅 第 26.2.5 节 “KEY 分区”。导致用户分区
NDBCLUSTER
表不满足以下两个要求之一或两者的CREATE TABLE
和ALTER TABLE
语句是不允许的,并且会失败并出现错误:该表必须具有显式主键。
表的分区表达式中列出的所有列都必须是主键的一部分。
例外。 如果使用空列列表(即,使用
PARTITION BY [LINEAR] KEY()
)创建用户分区NDBCLUSTER
表,则不需要显式主键。NDBCLUSTER 表的最大分区数。 使用用户定义的分区时,可以为
NDBCLUSTER
表定义的最大分区数为每个节点组 8 个。(有关 NDB 集群节点组的更多信息,请参阅 第 25.2.2 节 “NDB 集群节点、节点组、分片副本和分区”。)不支持 DROP PARTITION。 无法使用
ALTER TABLE ... DROP PARTITION
从NDB
表中删除分区。支持对 NDB 表使用ALTER TABLE
的其他分区扩展(ADD PARTITION
、REORGANIZE PARTITION
和COALESCE PARTITION
),但使用复制,因此未进行优化。请参阅 第 26.3.1 节 “RANGE 和 LIST 分区的管理” 和 第 15.1.9 节 “ALTER TABLE 语句”。分区选择。
NDB
表不支持分区选择。有关更多信息,请参阅第 26.5 节“分区选择”。JSON 数据类型。 NDB 9.0 附带的 mysqld 支持
NDB
表的 MySQLJSON
数据类型。一个
NDB
表最多可以有 3 个JSON
列。NDB API 没有专门用于处理
JSON
数据的规定,它只是将JSON
数据视为BLOB
数据。将数据作为JSON
处理必须由应用程序执行。