NDB群集中不符合SQL语法
一些与某些MySQL功能有关的SQL语句在与NDB
表一起使用时会产生错误,如下表所示:
- 临时表。不支持临时表。尝试创建使用
NDB
存储引擎的临时表或更改现有的临时表使用NDB
失败,并显示错误表存储引擎“ ndbcluster”,不支持创建选项“ TEMPORARY”。 NDB表中的索引和键。 NDB群集表上的键和索引受以下限制:
- 列宽。尝试在
NDB
宽度大于3072字节的表列上创建索引成功,但是实际上只有前3072个字节用于索引。在这种情况下,警告“指定密钥”太长;发出最大密钥长度为3072字节,并且一条SHOW CREATE TABLE
语句显示索引的长度为3072。 - TEXT和BLOB列。您不能在
NDB
使用任何TEXT
或BLOB
数据类型的表列上创建索引。 FULLTEXT索引。该
NDB
存储引擎不支持FULLTEXT
索引,这是可能的MyISAM
和InnoDB
唯一的表。但是,您可以在
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
在子表包含一个或多个任何TEXT
或BLOB
类型的列时,不支持。(缺陷#89511,错误#27484882) SET DEFAULT
不支持。(也不支持InnoDB
。)- 该
NO ACTION
关键字被接受,但作为治疗RESTRICT
。NO ACTION
,这是标准的SQL关键字,是MySQL 8.0的默认设置。(与相同InnoDB
。) - 在NDB Cluster的早期版本中,当创建带有外键引用另一个表中的索引的表时,有时即使索引中各列的顺序不匹配,也可以创建外键。并非总是在内部返回适当的错误。此问题的部分修复改善了大多数情况下内部使用的错误;但是,如果父索引是唯一索引,则这种情况仍然有可能发生。(缺陷号18094360)
有关更多信息,请参见“ FOREIGN KEY约束”和“ FOREIGN KEY约束”。
- NDB群集和几何数据类型。表支持几何数据类型(
WKT
和WKB
)NDB
。但是,不支持空间索引。 字符集和二进制日志文件。当前,
ndb_apply_status
和ndb_binlog_index
表是使用latin1
(ASCII)字符集创建的。因为二进制日志的名称记录在此表中,所以在这些表中未正确引用使用非拉丁字符命名的二进制日志文件。这是一个已知问题,我们正在努力解决。错误35226)要解决此问题,命名二进制日志文件或设置任何时候只使用Latin-1字符
--basedir
,--log-bin
或--log-bin-index
选择。使用用户定义的分区创建NDB表。 NDB群集中对用户定义的分区的支持仅限于[
LINEAR
]KEY
分区。在语句中ENGINE=NDB
或语句中使用任何其他分区类型都会导致错误。ENGINE=NDBCLUSTER
CREATE TABLE
可以覆盖此限制,但是在生产设置中不支持这样做。有关详细信息,请参阅用户定义的分区和NDB存储引擎(NDB群集)。
默认分区方案。默认情况下,所有NDB群集表都通过
KEY
使用表的主键作为分区键进行分区。如果没有为表显式设置主键,则使用由存储引擎自动创建的“ hidden ”主键NDB
。有关这些和相关问题的更多讨论,请参见“按键分区”。CREATE TABLE
不允许ALTER TABLE
导致用户分区NDBCLUSTER
表不满足以下两个要求中的一个或两个的语句,并且这些语句失败并出现错误:- 该表必须具有显式主键。
- 该表的分区表达式中列出的所有列都必须是主键的一部分。
例外。如果
NDBCLUSTER
使用空列列表(即使用PARTITION BY[LINEAR] KEY()
)创建了用户分区表,则不需要显式主键。NDBCLUSTER表的最大分区数。
NDBCLUSTER
使用用户定义的分区时,一个表可以定义的最大分区数是每个节点组8个。(有关NDB群集节点组的更多信息,请参见“ NDB群集节点,节点组,副本和分区”。不支持DROP PARTITION。无法
NDB
使用从表中删除分区ALTER TABLE ... DROP PARTITION
。其他分区扩展ALTER TABLE
-ADD PARTITION
,REORGANIZE PARTITION
和COALESCE PARTITION
-are支持NDB表,但使用复制,因此不进行优化。请参见“ RANGE和LIST分区的管理”和“ ALTER TABLE语句”。- 基于行的复制。在NDB群集中使用基于行的复制时,不能禁用二进制日志记录。也就是说,
NDB
存储引擎将忽略的值sql_log_bin
。 JSON数据类型。NDB 8.0随附的mysqld中的表
JSON
支持 MySQL 数据类型。NDB
一个
NDB
表最多可以包含3JSON
列。NDB API没有使用
JSON
数据的特殊规定,它只是将其视为BLOB
数据。处理数据JSON
必须由应用程序执行。