某些与特定 MySQL 功能相关的 SQL 语句在与 NDB
表一起使用时会产生错误,如下列列表所述
临时表。 临时表不受支持。尝试创建使用
NDB
存储引擎的临时表,或将现有的临时表更改为使用NDB
会导致以下错误:表存储引擎 'ndbcluster' 不支持创建选项 'TEMPORARY'.NDB 表中的索引和键。 NDB Cluster 表上的键和索引受到以下限制
列宽度。 尝试在
NDB
表列上创建索引,该列的宽度大于 3072 字节,会被拒绝,并显示错误ER_TOO_LONG_KEY
:指定的键过长;最大键长度为 3072 字节.尝试在
NDB
表列上创建索引,该列的宽度大于 3056 字节,会成功,但会显示警告。在这种情况下,不会生成统计信息,这意味着可能会选择非最佳执行计划。因此,如果可能,您应该考虑将索引长度缩短至 3056 字节以下。FULLTEXT 索引。
NDB
存储引擎不支持FULLTEXT
索引,这仅适用于MyISAM
和InnoDB
表。使用 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
在子表包含一个或多个任何TEXT
或BLOB
类型的列时也不受支持。(Bug #89511、Bug #27484882)SET DEFAULT
不受支持。(InnoDB
也不支持。)NO ACTION
关键字被接受,但被视为RESTRICT
。NO ACTION
是一个标准 SQL 关键字,在 MySQL 8.4 中是默认值。(与InnoDB
相同。)在 NDB Cluster 的早期版本中,当创建带有外键引用的另一个表中的索引的表时,有时似乎可以创建外键,即使索引中的列顺序不匹配,这是因为内部并不总是返回适当的错误。对此问题的部分修复改善了内部使用的错误,使其在大多数情况下都能正常工作;但是,在父索引是唯一索引的情况下,这种情况仍然可能发生。(Bug #18094360)
有关更多信息,请参阅 第 15.1.20.5 节,"FOREIGN KEY 约束" 以及 第 1.7.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
分区。在CREATE TABLE
语句中使用任何其他分区类型以及ENGINE=NDB
或ENGINE=NDBCLUSTER
会导致错误。可以覆盖此限制,但这不支持在生产环境中使用。有关详细信息,请参阅 用户定义的分区和 NDB 存储引擎 (NDB Cluster)。
默认分区方案。 所有 NDB Cluster 表默认使用
KEY
进行分区,使用表的 主键作为分区键。如果未为表显式设置主键,则会使用NDB
存储引擎自动创建的 “隐藏” 主键。有关这些问题和其他相关问题的更多讨论,请参阅 第 26.2.5 节,"KEY 分区"。CREATE TABLE
和ALTER TABLE
语句会导致用户分区NDBCLUSTER
表不满足以下两个要求中的一个或两个,则不允许,并会显示错误该表必须具有显式主键。
表的分区表达式中列出的所有列都必须是主键的一部分。
例外情况。 如果使用空列列表(即使用
PARTITION BY [LINEAR] KEY()
)创建用户分区NDBCLUSTER
表,则不需要显式主键。NDBCLUSTER 表的最大分区数量。 使用用户定义的分区时,为
NDBCLUSTER
表定义的最大分区数量为每个节点组 8 个。(有关 NDB Cluster 节点组的更多信息,请参阅 第 25.2.2 节,"NDB Cluster 节点、节点组、片段副本和分区"。)不支持 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.4 附带的 mysqld 中受NDB
表支持。NDB
表最多可以有 3 个JSON
列。NDB API 没有为处理
JSON
数据提供任何特殊配置,它将JSON
数据简单地视为BLOB
数据。应用程序必须处理JSON
数据。