#### 23.2.7.1 不符合 NDB Cluster 中的 SQL 语法

[](<>)

与某些 MySQL 功能相关的一些 SQL 语句在使用时会产生错误[`新开发银行`](mysql-cluster.html)表，如下表所述：

-   **临时表。**不支持临时表。尝试创建一个使用[`新开发银行`](mysql-cluster.html)存储引擎或更改现有临时表以使用[`新开发银行`](mysql-cluster.html)失败并出现错误表存储引擎“ndbcluster”不支持创建选项“TEMPORARY”。

-   **NDB 表中的索引和键。**NDB Cluster 表上的键和索引受到以下限制：

    -   **列宽。**尝试创建索引`新开发银行`宽度大于 3072 字节的 table 列成功，但实际上只有前 3072 字节用于索引。在这种情况下，警告Specified key is too long；最大密钥长度为 3072 字节，并且[`显示创建表`](show-create-table.html)语句显示索引的长度为 3072。

    -   **TEXT 和 BLOB 列。**您不能在[`新开发银行`](mysql-cluster.html)使用任何[`文本`](blob.html)要么[`斑点`](blob.html)数据类型。

    -   **FULLTEXT 索引。**这[`新开发银行`](mysql-cluster.html)存储引擎不支持`全文`索引，这是可能的[`MyISAM`](myisam-storage-engine.html)和[`InnoDB`](innodb-storage-engine.html)仅限表。

        但是，您可以在[`VARCHAR`](char.html)列[`新开发银行`](mysql-cluster.html)表。

    -   **使用哈希键和 NULL。**在唯一键和主键中使用可为空的列意味着使用这些列的查询将作为全表扫描处理。要解决此问题，请创建列`非空`, 或重新创建索引而不使用`使用哈希`选项。

    -   **前缀。**没有前缀索引；只能索引整个列。（一个大小`新开发银行`列索引始终与列的宽度（以字节为单位）相同，最多（包括）3072 个字节，如本节前面所述。另见[第 23.2.7.6 节，“NDB 集群中不支持或缺少的功能”](mysql-cluster-limitations-unsupported.html)，了解更多信息。）

    -   **位列。**一种[`少量`](bit-type.html)列不能是主键、唯一键或索引，也不能是复合主键、唯一键或索引的一部分。

    -   **汽车\_增量列。**与其他 MySQL 存储引擎一样，[`新开发银行`](mysql-cluster.html)存储引擎最多可以处理一个`自动递增`每个表的列，并且该列必须被索引。但是，对于没有显式主键的 NDB 表，`自动递增`列被自动定义并用作“隐藏”主键。因此，您无法创建`新开发银行`有一个表`自动递增`列并且没有显式主键。

        下列[`创建表`](create-table.html)语句不起作用，如下所示：

        ```
        # 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
        ```

        以下语句创建一个具有主键的表，`自动递增`列，以及该列上的索引，然后成功：

        ```
        # 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`](innodb-storage-engine.html)，受以下限制：

    -   作为外键引用的每一列都需要一个明确的唯一键，如果它不是表的主键。

    -   `更新级联`当引用是父表的主键时不支持。

        这是因为主键的更新是通过删除旧行（包含旧主键）和插入新行（使用新主键）来实现的。这对用户来说是不可见的`NDB`内核，它认为这两行是相同的，因此无法知道这个更新应该级联。

    -   `关于删除级联`如果子表包含以下任一项的一列或多列，则也不支持[`文本`](blob.html)或[`斑点`](blob.html)类型。（臭虫89511，臭虫27484882）

    -   `设置默认值`不支持。（也不支持[`InnoDB`](innodb-storage-engine.html).)

    -   这个`不采取行动`关键字被接受，但被视为`限制`.`不采取行动`，这是一个标准的SQL关键字，是MySQL 8.0中的默认值。（也与`InnoDB`.)

    -   在早期版本的NDB Cluster中，当创建一个外键引用另一个表中的索引的表时，有时似乎可以创建外键，即使索引中列的顺序不匹配，这是因为并不总是在内部返回适当的错误。对这个问题的部分修复改善了大多数情况下内部使用的错误；但是，如果父索引是唯一索引，则仍然可能发生这种情况。（Bug#18094360）

        有关更多信息，请参阅[第13.1.20.5节，“外键约束”](create-table-foreign-keys.html)和[第1.7.3.2节，“外键约束”](constraint-foreign-key.html).

-   **NDB群集和几何数据类型。** [](<>)几何数据类型(`WKT`和`WKB`)支持[`NDB`](mysql-cluster.html)桌子。但是，不支持空间索引。

-   **字符集和二进制日志文件。**目前`ndb_应用_状态`和`ndb_binlog_索引`表是使用`拉丁语1`（ASCII）字符集。由于二进制日志的名称记录在此表中，因此使用非拉丁字符命名的二进制日志文件在这些表中没有正确引用。这是一个已知的问题，我们正在努力解决。（错误#50226）

    要解决这个问题，在命名二进制日志文件或设置任何[`--basedir`](server-system-variables.html#sysvar_basedir), [`--木箱`](replication-options-binary-log.html#option_mysqld_log-bin)或[`--日志箱索引`](replication-options-binary-log.html#option_mysqld_log-bin-index)选项。

-   **使用用户定义的分区创建NDB表。**  [](<>) [](<>) [](<>)NDB集群中对用户定义分区的支持仅限于[`线性的`] `钥匙`分区。使用任何其他分区类型`引擎=NDB`或`引擎=NDBCLUSTER`在一个[`创建表格`](create-table.html)语句会导致错误。

    可以覆盖此限制，但在生产设置中不支持这样做。有关详细信息，请参阅[用户定义的分区和NDB存储引擎（NDB群集）](partitioning-limitations-storage-engines.html#partitioning-limitations-ndb).

    **默认分区方案。**默认情况下，所有NDB集群表都按`钥匙`使用表的主键作为分区键。如果没有为表显式设置主键，则由[`NDB`](mysql-cluster.html)而是使用存储引擎。有关这些及相关问题的更多讨论，请参阅[第24.2.5节，“密钥分区”](partitioning-key.html).

    [`创建表格`](create-table.html)和[`改变桌子`](alter-table.html)会导致用户分区的语句[`NDBCLUSTER`](mysql-cluster.html)不允许表格不满足以下两个要求中的任何一个或两个，并且出现错误：

    1.  表必须具有显式主键。

    2.  表的分区表达式中列出的所有列都必须是主键的一部分。

    **例外**如果用户分区[`NDBCLUSTER`](mysql-cluster.html)表是使用空列列表创建的（即使用`按[LINEAR]键划分（）`)，则不需要显式主键。

    **NDBCLUSTER表的最大分区数。**可以为一个分区定义的最大分区数[`NDBCLUSTER`](mysql-cluster.html)当采用用户定义的分区时，每个节点组的表为8。（见[第23.2.2节，“NDB群集节点、节点组、片段副本和分区”](mysql-cluster-nodes-groups.html)，以获取有关NDB群集节点组的详细信息。

    **不支持删除分区。**无法从中删除分区[`NDB`](mysql-cluster.html)使用`改变桌子。。。放置分区`.其他分区扩展[`改变桌子`](alter-table.html)—`添加分区`, `重新组织分区`和`合并分区`-NDB表支持，但使用复制，因此未进行优化。看见[第24.3.1节，“范围和列表分区的管理”](partitioning-management-range-list.html)和[第13.1.9节“更改表格声明”](alter-table.html).

    **分区选择。**不支持分区选择`NDB`桌子。看见[第24.5节“分区选择”](partitioning-selection.html)，以获取更多信息。

-   **JSON数据类型。**MySQL[`JSON`](json.html)数据类型受支持`NDB`桌子[**mysqld**](mysqld.html)提供NDB 8.0。

    [](<>)

    一`NDB`表最多可以有3个`JSON`柱。

    NDB API没有特别规定与`JSON`数据，它只是将其视为`斑点`数据将数据处理为`JSON`必须由应用程序执行。
