某些与 MySQL 特性相关的 SQL 语句在使用 NDB
表时会产生错误,如下列表所示:
-
临时表。 临时表不受支持。尝试创建一个使用
NDB
存储引擎的临时表或将现有的临时表修改为使用NDB
都将失败,错误信息为 Table storage engine 'ndbcluster' does not support the create option 'TEMPORARY'。 -
NDB 表中的索引和键。 NDB 集群表中的键和索引受以下限制:
-
列宽度。 尝试在
NDB
表的列上创建索引,该列的宽度超过 3072 字节时,虽然创建索引成功,但只有前 3072 字节被实际用于索引。在这种情况下,会发出警告 Specified key was too long; max key length is 3072 bytes,并且SHOW CREATE TABLE
语句将显示索引的长度为 3072。 -
FULLTEXT 索引。
NDB
存储引擎不支持FULLTEXT
索引,该功能仅适用于MyISAM
和InnoDB
表。 -
使用 HASH 键和 NULL。 在唯一键和主键中使用可为空的列意味着使用这些列的查询将被处理为全表扫描。要解决这个问题,请将该列设置为
NOT NULL
,或重新创建索引而不使用USING HASH
选项。 -
前缀。 没有前缀索引;只能对整个列进行索引。(
NDB
列索引的大小始终等于该列的宽度,以字节为单位,最高达 3072 字节,如本节前面所述。另请参阅 第 25.2.7.6 节,“NDB 集群中不支持或缺失的功能”,以获取更多信息。) -
BIT 列。
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.3 中的外键约束支持与
InnoDB
相似,subject to the following restrictions:-
每个作为外键引用的列都需要一个明确的唯一键,如果它不是表的主键。
-
ON UPDATE CASCADE
不支持当引用是到父表的主键时。这是因为主键的更新被实现为删除旧行(包含旧主键)加上插入新行(带有新主键)。这对
NDB
内核不可见,它将这两行视为相同的行,因此不知道该更新应该被级联。 -
ON DELETE CASCADE
也不支持在子表包含一个或多个TEXT
或BLOB
类型的列时。(Bug #89511, Bug #27484882) -
SET DEFAULT
不支持。(同样不支持InnoDB
。) -
关键字
NO ACTION
被接受,但被视为RESTRICT
。NO ACTION
是标准 SQL 关键字,是 MySQL 8.3 的默认值。(同样适用于InnoDB
。) -
在早期版本的 NDB Cluster 中,当创建一个表具有外键引用另一个表的索引时,有时似乎可以创建外键,即使索引中的列顺序不匹配,这是因为内部错误没有被正确返回。(Bug #18094360)
有关更多信息,请参阅 第 15.1.20.5 节,“FOREIGN KEY 约束” 和 第 1.6.3.2 节,“FOREIGN KEY 约束”。
-
-
NDB Cluster 和几何数据类型。 几何数据类型 (
WKT
和WKB
) 支持NDB
表。然而,空间索引不支持。 -
字符集和二进制日志文件。 目前,
ndb_apply_status
和ndb_binlog_index
表是使用latin1
(ASCII)字符集创建的。因为二进制日志文件的名称记录在这个表中,使用非拉丁字符命名的二进制日志文件在这些表中没有正确引用。(Bug #50226)要解决这个问题,请在命名二进制日志文件或设置任何
--basedir
、--log-bin
或--log-bin-index
选项时仅使用拉丁-1 字符。 -
创建 NDB 表具有用户定义的分区。 NDB Cluster 中的用户定义分区支持仅限于 [
LINEAR
]KEY
分区。使用ENGINE=NDB
或ENGINE=NDBCLUSTER
在CREATE TABLE
语句中,结果将出错。可以 override 这个限制,但是在生产设置中不支持使用。有关详细信息,请参阅 用户定义分区和 NDB 存储引擎 (NDB Cluster)。
默认分区方案。 所有 NDB Cluster 表默认使用
KEY
分区,使用表的主键作为分区键。如果表没有明确设置主键,NDB
存储引擎自动创建的“隐藏”主键将被使用。有关这些和相关问题的讨论,请参阅 第 26.2.5 节,“KEY Partitioning”。CREATE TABLE
和ALTER TABLE
语句,如果导致用户分区的NDBCLUSTER
表不满足以下两个要求之一,将不被允许,并将以错误形式失败:-
表必须有一个明确的主键。
-
所有列在表的分区表达式中必须是主键的一部分。
例外。 如果用户分区的
NDBCLUSTER
表使用空列列表创建(即使用PARTITION BY [LINEAR] KEY()
),那么不需要明确的主键。NDBCLUSTER 表的最大分区数。 使用用户定义的分区时,
NDBCLUSTER
表每个节点组最多可以定义 8 个分区。(请参阅 第 25.2.2 节,“NDB 集群节点、节点组、碎片副本和分区”,以获取更多关于 NDB 集群节点组的信息。不支持 DROP PARTITION。 无法使用
ALTER TABLE ... DROP PARTITION
从NDB
表中删除分区。其他分区扩展到ALTER TABLE
——ADD PARTITION
、REORGANIZE PARTITION
和COALESCE PARTITION
—— 对 NDB 表是支持的,但使用复制因此不是优化的。请参阅 第 26.3.1 节,“RANGE 和 LIST 分区管理” 和 第 15.1.9 节,“ALTER TABLE 语句”。分区选择。 不支持
NDB
表的分区选择。请参阅 第 26.5 节,“分区选择”,以获取更多信息。 -
-
JSON 数据类型。 MySQL
JSON
数据类型在 NDB 8.3 中的 mysqld 中支持NDB
表。一个
NDB
表最多可以有 3 个JSON
列。NDB API 没有特殊的 JSON 数据处理机制,将其视为
BLOB
数据。应用程序必须处理 JSON 数据。