与某些 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。使用哈希键和 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 CASCADE
TEXT
在子表包含任何或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
和 )。但是,不支持空间索引。WKB
NDB
字符集和二进制日志文件。 目前,
ndb_apply_status
和ndb_binlog_index
表是使用latin1
(ASCII) 字符集创建的。由于此表中记录了二进制日志的名称,因此这些表中未正确引用使用非拉丁字符命名的二进制日志文件。这是一个已知问题,我们正在努力解决。(漏洞 #50226)要解决此问题,请在命名二进制日志文件或设置任何 、 或 选项时仅使用 Latin-
--basedir
1--log-bin
字符--log-bin-index
。使用用户定义的分区创建 NDB 表。 NDB Cluster 中对用户定义分区的支持仅限于 [
LINEAR
]KEY
分区。在 语句中ENGINE=NDB
或 语句中使用任何其他分区类型会导致错误。ENGINE=NDBCLUSTER
CREATE TABLE
可以覆盖此限制,但不支持在生产设置中使用这样做。有关详细信息,请参阅用户定义的分区和 NDB 存储引擎(NDB Cluster)。
默认分区方案。 默认情况下,所有 NDB Cluster 表都
KEY
使用表的主键作为分区键进行分区。如果没有为表显式设置主键,则使用存储引擎自动创建 的“隐藏”主键。NDB
有关这些和相关问题的更多讨论,请参阅第 24.2.5 节,“KEY 分区”。CREATE TABLE
ALTER TABLE
不允许使用会导致用户分区NDBCLUSTER
表不满足以下两个要求中的一个或两个的语句,并且会失败并出现错误 :该表必须具有明确的主键。
表的分区表达式中列出的所有列都必须是主键的一部分。
例外。 如果用户分区
NDBCLUSTER
表是使用空列列表(即使用PARTITION BY [LINEAR] KEY()
)创建的,则不需要显式主键。NDBCLUSTER 表的最大分区数。 使用用户定义的分区时,可以为
NDBCLUSTER
表定义的最大分区数是每个节点组 8 个。(有关NDB Cluster节点组的更多信息, 请参阅第 23.2.2 节,“NDB Cluster 节点、节点组、片段副本和分区” 。不支持删除分区。 无法使用 删除
NDB
表中 的分区ALTER TABLE ... DROP PARTITION
。NDB 表支持ALTER TABLE
—ADD PARTITION
、REORGANIZE 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
表最多可以有 3JSON
列。NDB API 没有处理
JSON
数据的特殊规定,它只是将数据视为BLOB
数据。处理JSON
必须由应用程序执行的数据。