文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 39.9Mb
PDF (A4) - 40.0Mb
手冊頁 (TGZ) - 258.5Kb
手冊頁 (Zip) - 365.5Kb
資訊 (Gzip) - 4.0Mb
資訊 (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  NDB Cluster 中不符合 SQL 語法的情況

25.2.7.1 NDB Cluster 中不符合 SQL 語法的情況

當某些與 MySQL 功能相關的 SQL 陳述式用於 NDB 表格時,會產生錯誤,如下列清單所述

  • 暫存表格。  不支援暫存表格。嘗試建立使用 NDB 儲存引擎的暫存表格,或將現有的暫存表格變更為使用 NDB 都會失敗,並出現錯誤訊息 表格儲存引擎 'ndbcluster' 不支援建立選項 'TEMPORARY'

  • NDB 表格中的索引和鍵。  NDB Cluster 表格上的鍵和索引受下列限制約束

    • 欄寬。  嘗試在寬度大於 3072 個位元組的 NDB 表格欄上建立索引會遭到拒絕,並出現 ER_TOO_LONG_KEY指定的鍵太長;最大鍵長度為 3072 個位元組

      嘗試在寬度大於 3056 個位元組的 NDB 表格欄上建立索引會成功,但會出現警告。在這種情況下,不會產生統計資訊,這表示可能會選取非最佳的執行計畫。因此,如果可能,您應該考慮將索引長度縮短至 3056 個位元組以下。

    • TEXT 和 BLOB 欄。  您無法在 NDB 表格欄上建立索引,這些表格欄使用任何 TEXTBLOB 資料類型。

    • FULLTEXT 索引。  NDB 儲存引擎不支援 FULLTEXT 索引,這種索引僅適用於 MyISAMInnoDB 表格。

      不過,您可以在 NDB 表格的 VARCHAR 欄上建立索引。

    • 使用 HASH 鍵和 NULL。  在唯一鍵和主鍵中使用可為 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 核心不可見,後者會將這兩個列視為相同,因此無法知道應該串聯此更新。

    • 如果子表格包含任何 TEXTBLOB 類型的一個或多個欄時,也不支援 ON DELETE CASCADE。(錯誤 #89511、錯誤 #27484882)

    • 不支援 SET DEFAULT。(InnoDB 也不支援。)

    • 接受 NO ACTION 關鍵字,但會將其視為 RESTRICTNO ACTION 是一個標準 SQL 關鍵字,在 MySQL 8.4 中是預設值。(也與 InnoDB 相同。)

    • 在 NDB Cluster 的先前版本中,當建立具有參照另一個表格中索引的外來鍵的表格時,有時可能會建立外來鍵,即使索引中欄的順序不符也沒問題,原因是內部並非總是會傳回適當的錯誤。針對這個問題的部分修正改善了內部使用的錯誤,使其在大多數情況下可以運作;不過,如果父索引是唯一索引,仍然可能發生這種情況。(錯誤 #18094360)

    如需詳細資訊,請參閱 第 15.1.20.5 節「外來鍵限制」,以及 第 1.7.3.2 節「外來鍵限制」

  • NDB Cluster 和幾何資料類型。  NDB 表格支援幾何資料類型(WKTWKB)。不過,不支援空間索引。

  • 字元集和二進位日誌檔。  目前,使用 latin1 (ASCII) 字元集建立 ndb_apply_statusndb_binlog_index 表格。由於二進位日誌的名稱會記錄在此表格中,因此使用非拉丁字元命名的二進位日誌檔在此表格中會無法正確參照。這是一個已知的問題,我們正在努力解決。(錯誤 #50226)

    若要解決此問題,在命名二進位日誌檔或設定任何 --basedir--log-bin--log-bin-index 選項時,請僅使用 Latin-1 字元。

  • 使用使用者定義分割區建立 NDB 表格。  NDB Cluster 中對使用者定義分割區的支援僅限於 [LINEAR] KEY 分割區。在 CREATE TABLE 陳述式中使用 ENGINE=NDBENGINE=NDBCLUSTER 的任何其他分割區類型都會導致錯誤。

    可以覆寫此限制,但不支持在生產環境中使用。如需詳細資訊,請參閱 使用者定義的分割區和 NDB 儲存引擎 (NDB Cluster)

    預設分割區配置。  根據預設,所有 NDB Cluster 表格都會使用表格的主鍵以 KEY 分割區。如果沒有為表格明確設定主鍵,則會改用 NDB 儲存引擎自動建立的「隱藏」主鍵。如需有關這些及相關問題的其他討論,請參閱 第 26.2.5 節「KEY 分割區」

    會導致使用者分割的 NDBCLUSTER 資料表不符合以下任一或兩個要求的 CREATE TABLEALTER TABLE 陳述式是不允許的,並且會發生錯誤。

    1. 資料表必須具有明確的主鍵。

    2. 資料表分割運算式中列出的所有欄位都必須是主鍵的一部分。

    例外情況。 如果使用者分割的 NDBCLUSTER 資料表是使用空的欄位清單 (亦即,使用 PARTITION BY [LINEAR] KEY()) 建立的,則不需要明確的主鍵。

    NDBCLUSTER 資料表的最大分割區數量。 當採用使用者定義的分割時,每個節點群組可以為 NDBCLUSTER 資料表定義的最大分割區數量為 8 個。(如需有關 NDB Cluster 節點群組的更多資訊,請參閱第 25.2.2 節,「NDB Cluster 節點、節點群組、片段複本和分割區」)。

    不支援 DROP PARTITION。 不可能使用 ALTER TABLE ... DROP PARTITIONNDB 資料表捨棄分割區。ALTER TABLE 的其他分割擴充功能 — ADD PARTITIONREORGANIZE PARTITIONCOALESCE PARTITION — 支援 NDB 資料表,但使用複製,因此未經最佳化。請參閱第 26.3.1 節,「RANGE 和 LIST 分割區的管理」以及第 15.1.9 節,「ALTER TABLE 陳述式」

    分割區選取。NDB 資料表不支援分割區選取。如需更多資訊,請參閱第 26.5 節,「分割區選取」

  • JSON 資料類型。 在 NDB 8.4 隨附的 mysqld 中,NDB 資料表支援 MySQL JSON 資料類型。

    一個 NDB 資料表最多可以有 3 個 JSON 欄位。

    NDB API 沒有用於處理 JSON 資料的特殊配置,它只將其視為 BLOB 資料。將資料處理為 JSON 必須由應用程式執行。