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


MySQL 8.4 參考手冊  /  ...  /  CREATE TABLE 陳述式

15.1.20 CREATE TABLE 陳述式

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
    (create_definition,...)
    [table_options]
    [partition_options]

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
    [(create_definition,...)]
    [table_options]
    [partition_options]
    [IGNORE | REPLACE]
    [AS] query_expression

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
    { LIKE old_tbl_name | (LIKE old_tbl_name) }

create_definition: {
    col_name column_definition
  | {INDEX | KEY} [index_name] [index_type] (key_part,...)
      [index_option] ...
  | {FULLTEXT | SPATIAL} [INDEX | KEY] [index_name] (key_part,...)
      [index_option] ...
  | [CONSTRAINT [symbol]] PRIMARY KEY
      [index_type] (key_part,...)
      [index_option] ...
  | [CONSTRAINT [symbol]] UNIQUE [INDEX | KEY]
      [index_name] [index_type] (key_part,...)
      [index_option] ...
  | [CONSTRAINT [symbol]] FOREIGN KEY
      [index_name] (col_name,...)
      reference_definition
  | check_constraint_definition
}

column_definition: {
    data_type [NOT NULL | NULL] [DEFAULT {literal | (expr)} ]
      [VISIBLE | INVISIBLE]
      [AUTO_INCREMENT] [UNIQUE [KEY]] [[PRIMARY] KEY]
      [COMMENT 'string']
      [COLLATE collation_name]
      [COLUMN_FORMAT {FIXED | DYNAMIC | DEFAULT}]
      [ENGINE_ATTRIBUTE [=] 'string']
      [SECONDARY_ENGINE_ATTRIBUTE [=] 'string']
      [STORAGE {DISK | MEMORY}]
      [reference_definition]
      [check_constraint_definition]
  | data_type
      [COLLATE collation_name]
      [GENERATED ALWAYS] AS (expr)
      [VIRTUAL | STORED] [NOT NULL | NULL]
      [VISIBLE | INVISIBLE]
      [UNIQUE [KEY]] [[PRIMARY] KEY]
      [COMMENT 'string']
      [reference_definition]
      [check_constraint_definition]
}

data_type:
    (see Chapter 13, Data Types)

key_part: {col_name [(length)] | (expr)} [ASC | DESC]

index_type:
    USING {BTREE | HASH}

index_option: {
    KEY_BLOCK_SIZE [=] value
  | index_type
  | WITH PARSER parser_name
  | COMMENT 'string'
  | {VISIBLE | INVISIBLE}
  |ENGINE_ATTRIBUTE [=] 'string'
  |SECONDARY_ENGINE_ATTRIBUTE [=] 'string'
}

check_constraint_definition:
    [CONSTRAINT [symbol]] CHECK (expr) [[NOT] ENFORCED]

reference_definition:
    REFERENCES tbl_name (key_part,...)
      [MATCH FULL | MATCH PARTIAL | MATCH SIMPLE]
      [ON DELETE reference_option]
      [ON UPDATE reference_option]

reference_option:
    RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT

table_options:
    table_option [[,] table_option] ...

table_option: {
    AUTOEXTEND_SIZE [=] value
  | AUTO_INCREMENT [=] value
  | AVG_ROW_LENGTH [=] value
  | [DEFAULT] CHARACTER SET [=] charset_name
  | CHECKSUM [=] {0 | 1}
  | [DEFAULT] COLLATE [=] collation_name
  | COMMENT [=] 'string'
  | COMPRESSION [=] {'ZLIB' | 'LZ4' | 'NONE'}
  | CONNECTION [=] 'connect_string'
  | {DATA | INDEX} DIRECTORY [=] 'absolute path to directory'
  | DELAY_KEY_WRITE [=] {0 | 1}
  | ENCRYPTION [=] {'Y' | 'N'}
  | ENGINE [=] engine_name
  | ENGINE_ATTRIBUTE [=] 'string'
  | INSERT_METHOD [=] { NO | FIRST | LAST }
  | KEY_BLOCK_SIZE [=] value
  | MAX_ROWS [=] value
  | MIN_ROWS [=] value
  | PACK_KEYS [=] {0 | 1 | DEFAULT}
  | PASSWORD [=] 'string'
  | ROW_FORMAT [=] {DEFAULT | DYNAMIC | FIXED | COMPRESSED | REDUNDANT | COMPACT}
  | START TRANSACTION 
  | SECONDARY_ENGINE_ATTRIBUTE [=] 'string'
  | STATS_AUTO_RECALC [=] {DEFAULT | 0 | 1}
  | STATS_PERSISTENT [=] {DEFAULT | 0 | 1}
  | STATS_SAMPLE_PAGES [=] value
  | tablespace_option
  | UNION [=] (tbl_name[,tbl_name]...)
}

partition_options:
    PARTITION BY
        { [LINEAR] HASH(expr)
        | [LINEAR] KEY [ALGORITHM={1 | 2}] (column_list)
        | RANGE{(expr) | COLUMNS(column_list)}
        | LIST{(expr) | COLUMNS(column_list)} }
    [PARTITIONS num]
    [SUBPARTITION BY
        { [LINEAR] HASH(expr)
        | [LINEAR] KEY [ALGORITHM={1 | 2}] (column_list) }
      [SUBPARTITIONS num]
    ]
    [(partition_definition [, partition_definition] ...)]

partition_definition:
    PARTITION partition_name
        [VALUES
            {LESS THAN {(expr | value_list) | MAXVALUE}
            |
            IN (value_list)}]
        [[STORAGE] ENGINE [=] engine_name]
        [COMMENT [=] 'string' ]
        [DATA DIRECTORY [=] 'data_dir']
        [INDEX DIRECTORY [=] 'index_dir']
        [MAX_ROWS [=] max_number_of_rows]
        [MIN_ROWS [=] min_number_of_rows]
        [TABLESPACE [=] tablespace_name]
        [(subpartition_definition [, subpartition_definition] ...)]

subpartition_definition:
    SUBPARTITION logical_name
        [[STORAGE] ENGINE [=] engine_name]
        [COMMENT [=] 'string' ]
        [DATA DIRECTORY [=] 'data_dir']
        [INDEX DIRECTORY [=] 'index_dir']
        [MAX_ROWS [=] max_number_of_rows]
        [MIN_ROWS [=] min_number_of_rows]
        [TABLESPACE [=] tablespace_name]

tablespace_option:
    TABLESPACE tablespace_name [STORAGE DISK]
  | [TABLESPACE tablespace_name] STORAGE MEMORY

query_expression:
    SELECT ...   (Some valid select or union statement)

CREATE TABLE 會建立具有指定名稱的資料表。您必須具有該資料表的 CREATE 權限。

預設情況下,資料表會使用 InnoDB 儲存引擎在預設資料庫中建立。如果資料表已存在、沒有預設資料庫,或資料庫不存在,則會發生錯誤。

MySQL 對於表格的數量沒有限制。底層檔案系統可能會對代表表格的檔案數量有所限制。個別的儲存引擎可能會施加引擎特定的限制。InnoDB 允許最多 40 億個表格。

關於表格的實體表示資訊,請參閱第 15.1.20.1 節,「CREATE TABLE 建立的檔案」

關於CREATE TABLE 陳述式,有幾個方面將在本節的以下主題中描述:

表格名稱

  • tbl_name

    表格名稱可以指定為 db_name.tbl_name,以便在特定資料庫中建立表格。無論是否有預設資料庫,這都有效,前提是資料庫存在。如果您使用帶引號的識別符號,請分別引號資料庫和表格名稱。例如,寫成 `mydb`.`mytbl`,而不是 `mydb.mytbl`

    關於允許的表格名稱規則,請參閱第 11.2 節,「結構描述物件名稱」

  • IF NOT EXISTS

    防止在表格存在時發生錯誤。但是,不會驗證現有表格的結構是否與 CREATE TABLE 陳述式所指示的結構相同。

暫時表格

您可以在建立表格時使用 TEMPORARY 關鍵字。TEMPORARY 表格僅在目前的工作階段中可見,並在工作階段關閉時自動刪除。如需更多資訊,請參閱第 15.1.20.2 節,「CREATE TEMPORARY TABLE 陳述式」

表格複製與拷貝

欄位資料類型與屬性

每個表格的欄位數硬性限制為 4096 個,但給定表格的有效最大值可能會較小,並且取決於第 10.4.7 節,「表格欄位計數和列大小的限制」中討論的因素。

  • data_type

    data_type 表示欄位定義中的資料類型。如需完整描述指定欄位資料類型的語法,以及關於每個類型屬性的資訊,請參閱第 13 章,《資料類型》

    • AUTO_INCREMENT 僅適用於整數類型。

    • 字元資料類型(CHARVARCHARTEXT 類型、ENUMSET,以及任何同義詞)可以包含 CHARACTER SET 以指定欄位的字元集。CHARSETCHARACTER SET 的同義詞。可以使用 COLLATE 屬性指定字元集的校對,以及任何其他屬性。如需詳細資訊,請參閱第 12 章,《字元集、校對、Unicode》。範例:

      CREATE TABLE t (c CHAR(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin);

      MySQL 8.4 將字元欄位定義中的長度規格解釋為字元。BINARYVARBINARY 的長度以位元組為單位。

    • 對於 CHARVARCHARBINARYVARBINARY 欄位,可以使用 col_name(length) 語法來指定索引前綴長度,建立僅使用欄位值前導部分的索引。BLOBTEXT 欄位也可以被索引,但 必須 給定前綴長度。對於非二進位字串類型,前綴長度以字元為單位;對於二進位字串類型,前綴長度以位元組為單位。也就是說,索引項目由每個欄位值的前 length 個字元組成,適用於 CHARVARCHARTEXT 欄位;而索引項目由每個欄位值的前 length 個位元組組成,適用於 BINARYVARBINARYBLOB 欄位。僅對欄位值的前綴建立索引可以使索引檔案小得多。關於索引前綴的其他資訊,請參閱第 15.1.15 節,「CREATE INDEX 陳述式」

      只有 InnoDBMyISAM 儲存引擎支援對 BLOBTEXT 欄位建立索引。例如:

      CREATE TABLE test (blob_col BLOB, INDEX(blob_col(10)));

      如果指定的索引前綴超過了最大欄位資料類型大小,CREATE TABLE 將按如下方式處理索引:

      • 對於非唯一索引,若啟用嚴格 SQL 模式,則會發生錯誤;若未啟用嚴格 SQL 模式,則索引長度將縮減到最大欄位資料類型大小範圍內,並產生警告。

      • 對於唯一索引,無論 SQL 模式如何,都會發生錯誤,因為縮減索引長度可能會允許插入不符合指定唯一性要求的非唯一項目。

    • JSON 欄位無法被索引。您可以透過在產生欄位上建立索引來解決此限制,該產生欄位會從 JSON 欄位擷取純量值。如需詳細範例,請參閱「索引產生欄位以提供 JSON 欄位索引」

  • NOT NULL | NULL

    如果未指定 NULLNOT NULL,則欄位將被視為已指定 NULL

    在 MySQL 8.4 中,只有 InnoDBMyISAMMEMORY 儲存引擎支援對可具有 NULL 值的欄位建立索引。在其他情況下,您必須將索引欄位宣告為 NOT NULL,否則會產生錯誤。

  • DEFAULT

    指定欄位的預設值。如需關於預設值處理的更多資訊,包括欄位定義不包含明確 DEFAULT 值的情況,請參閱第 13.6 節,「資料類型預設值」

    如果啟用 NO_ZERO_DATENO_ZERO_IN_DATE SQL 模式,並且根據該模式,日期值預設值不正確,則在未啟用嚴格 SQL 模式時,CREATE TABLE 會產生警告;若啟用嚴格模式,則會產生錯誤。例如,啟用 NO_ZERO_IN_DATE 時,c1 DATE DEFAULT '2010-00-00' 會產生警告。

  • VISIBLEINVISIBLE

    指定欄位的可見性。如果未出現任何關鍵字,則預設值為 VISIBLE。一個表格必須至少有一個可見欄位。嘗試使所有欄位都不可見會產生錯誤。如需更多資訊,請參閱第 15.1.20.10 節,「不可見欄位」

  • AUTO_INCREMENT

    整數欄位可以具有額外的 AUTO_INCREMENT 屬性。當您將 NULL(建議)或 0 的值插入索引的 AUTO_INCREMENT 欄位時,該欄位會設定為下一個序列值。通常這是 value+1,其中 value 是表格中目前該欄位的最大值。AUTO_INCREMENT 序列從 1 開始。

    若要在插入列後擷取 AUTO_INCREMENT 值,請使用 LAST_INSERT_ID() SQL 函式或 mysql_insert_id() C API 函式。請參閱第 14.15 節,「資訊函式」mysql_insert_id()

    如果啟用 NO_AUTO_VALUE_ON_ZERO SQL 模式,您可以在 AUTO_INCREMENT 欄位中將 0 儲存為 0,而不會產生新的序列值。請參閱第 7.1.11 節,「伺服器 SQL 模式」

    每個資料表只能有一個 AUTO_INCREMENT 欄位,該欄位必須建立索引,且不能有 DEFAULT 值。AUTO_INCREMENT 欄位只有在包含正值時才能正常運作。插入負數會被視為插入一個非常大的正數。這樣做是為了避免數字從正數「環繞」到負數時出現精確度問題,並確保你不會意外得到一個包含 0AUTO_INCREMENT 欄位。

    對於 MyISAM 資料表,你可以在多欄索引中指定一個 AUTO_INCREMENT 的次要欄位。請參閱第 5.6.9 節,「使用 AUTO_INCREMENT」

    為了使 MySQL 與某些 ODBC 應用程式相容,你可以使用以下查詢找到最後插入列的 AUTO_INCREMENT

    SELECT * FROM tbl_name WHERE auto_col IS NULL

    此方法要求 sql_auto_is_null 變數未設定為 0。請參閱第 7.1.8 節,「伺服器系統變數」

    關於 InnoDBAUTO_INCREMENT 的資訊,請參閱第 17.6.1.6 節,「InnoDB 中的 AUTO_INCREMENT 處理」。關於 AUTO_INCREMENT 和 MySQL 複寫的資訊,請參閱第 19.5.1.1 節,「複寫和 AUTO_INCREMENT」

  • 註解

    可以使用 COMMENT 選項為欄位指定註解,最多可達 1024 個字元。註解會由 SHOW CREATE TABLESHOW FULL COLUMNS 語法顯示。它也會顯示在 Information Schema 的 COLUMNS 表格的 COLUMN_COMMENT 欄位中。

  • COLUMN_FORMAT

    在 NDB Cluster 中,也可以使用 COLUMN_FORMATNDB 資料表的個別欄位指定資料儲存格式。允許的欄位格式為 FIXEDDYNAMICDEFAULTFIXED 用於指定固定寬度的儲存,DYNAMIC 允許欄位為變動寬度,而 DEFAULT 則會根據欄位的資料類型決定欄位使用固定寬度或變動寬度的儲存 (可能會被 ROW_FORMAT 指定符覆寫)。

    對於 NDB 資料表,COLUMN_FORMAT 的預設值為 FIXED

    在 NDB Cluster 中,以 COLUMN_FORMAT=FIXED 定義的欄位的最大可能偏移量為 8188 個位元組。如需更多資訊和可能的解決方法,請參閱第 25.2.7.5 節,「NDB Cluster 中與資料庫物件相關的限制」

    COLUMN_FORMAT 目前對使用 NDB 以外的儲存引擎的資料表欄位沒有任何影響。MySQL 8.4 會靜默忽略 COLUMN_FORMAT

  • ENGINE_ATTRIBUTESECONDARY_ENGINE_ATTRIBUTE 選項用於指定主要和次要儲存引擎的欄位屬性。這些選項保留供未來使用。

    指定給此選項的值是一個字串常值,其中包含有效的 JSON 文件或空字串 ('')。無效的 JSON 會被拒絕。

    CREATE TABLE t1 (c1 INT ENGINE_ATTRIBUTE='{"key":"value"}');

    ENGINE_ATTRIBUTESECONDARY_ENGINE_ATTRIBUTE 值可以重複指定而不會發生錯誤。在這種情況下,會使用最後指定的值。

    ENGINE_ATTRIBUTESECONDARY_ENGINE_ATTRIBUTE 值不會被伺服器檢查,也不會在資料表的儲存引擎變更時被清除。

  • STORAGE

    對於 NDB 資料表,可以使用 STORAGE 子句指定欄位是儲存在磁碟上還是記憶體中。STORAGE DISK 會將欄位儲存在磁碟上,而 STORAGE MEMORY 會使用記憶體內儲存。CREATE TABLE 語法仍必須包含 TABLESPACE 子句

    mysql> CREATE TABLE t1 (
        ->     c1 INT STORAGE DISK,
        ->     c2 INT STORAGE MEMORY
        -> ) ENGINE NDB;
    ERROR 1005 (HY000): Can't create table 'c.t1' (errno: 140)
    
    mysql> CREATE TABLE t1 (
        ->     c1 INT STORAGE DISK,
        ->     c2 INT STORAGE MEMORY
        -> ) TABLESPACE ts_1 ENGINE NDB;
    Query OK, 0 rows affected (1.06 sec)

    對於 NDB 資料表,STORAGE DEFAULT 等同於 STORAGE MEMORY

    STORAGE 子句對使用 NDB 以外的儲存引擎的資料表沒有任何影響。STORAGE 關鍵字僅在隨附於 NDB Cluster 的 mysqld 版本中支援;它在任何其他版本的 MySQL 中都無法辨識,任何嘗試使用 STORAGE 關鍵字的行為都會導致語法錯誤。

  • GENERATED ALWAYS

    用於指定產生的欄位表達式。關於產生欄位的資訊,請參閱第 15.1.20.8 節,「CREATE TABLE 和產生欄位」

    儲存的產生欄位可以建立索引。InnoDB 支援對虛擬產生欄位建立次要索引。請參閱第 15.1.20.9 節,「次要索引和產生欄位」

索引、外部鍵和 CHECK 約束

有數個關鍵字適用於建立索引、外部鍵和 CHECK 約束。除了以下說明之外,如需一般背景資訊,請參閱第 15.1.15 節,「CREATE INDEX 語法」第 15.1.20.5 節,「FOREIGN KEY 約束」第 15.1.20.6 節,「CHECK 約束」

  • CONSTRAINT symbol

    可以給予 CONSTRAINT symbol 子句來命名約束。如果未給予子句,或在 CONSTRAINT 關鍵字後未包含 symbol,則 MySQL 會自動產生約束名稱,但以下註明的例外情況除外。如果使用 symbol 值,則該值在每個綱要 (資料庫) 和每個約束類型中都必須是唯一的。重複的 symbol 會導致錯誤。另請參閱第 11.2.1 節,「識別碼長度限制」中有關產生約束識別碼長度限制的討論。

    請注意

    如果在外部鍵定義中未給予 CONSTRAINT symbol 子句,或在 CONSTRAINT 關鍵字後未包含 symbol,則 MySQL 會自動產生約束名稱。

    SQL 標準指定所有類型的約束 (主鍵、唯一索引、外部鍵、檢查) 都屬於同一個命名空間。在 MySQL 中,每個約束類型在每個綱要中都有自己的命名空間。因此,每種類型的約束名稱在每個綱要中都必須是唯一的,但不同類型的約束可以具有相同的名稱。

  • PRIMARY KEY

    一個唯一索引,其中所有索引欄位都必須定義為 NOT NULL。如果它們沒有明確宣告為 NOT NULL,MySQL 會隱式 (且靜默地) 宣告它們。一個資料表只能有一個 PRIMARY KEYPRIMARY KEY 的名稱永遠是 PRIMARY,因此不能用作任何其他類型索引的名稱。

    如果你的資料表沒有 PRIMARY KEY,且應用程式要求你資料表中的 PRIMARY KEY,則 MySQL 會傳回第一個沒有 NULL 欄位的 UNIQUE 索引作為 PRIMARY KEY

    InnoDB 資料表中,請將 PRIMARY KEY 保持簡短,以最大程度地減少次要索引的儲存額外負荷。每個次要索引條目都包含對應列的主鍵欄位複本。(請參閱第 17.6.2.1 節,「叢集索引和次要索引」。)

    在建立的資料表中,PRIMARY KEY 會放置在第一位,其次是所有 UNIQUE 索引,然後是非唯一索引。這有助於 MySQL 最佳化工具確定使用哪個索引的優先順序,並更快地偵測到重複的 UNIQUE 索引鍵。

    PRIMARY KEY 可以是多欄索引。但是,你無法在欄位規格中使用 PRIMARY KEY 索引鍵屬性來建立多欄索引。這樣做只會將該單一欄位標記為主要欄位。你必須使用單獨的 PRIMARY KEY(key_part, ...) 子句。

    如果資料表具有由單一整數類型欄位組成的 PRIMARY KEYUNIQUE NOT NULL 索引,則你可以在 SELECT 語法中使用 _rowid 來參照索引欄位,如唯一索引中所述。

    在 MySQL 中,PRIMARY KEY 的名稱為 PRIMARY。對於其他索引,如果你未指定名稱,則會為索引指定與第一個索引欄位相同的名稱,並加上可選的尾碼 (_2_3...) 以使其唯一。你可以使用 SHOW INDEX FROM tbl_name 來查看資料表的索引名稱。請參閱第 15.7.7.23 節,「SHOW INDEX 語法」

  • KEY | INDEX

    KEY 通常是 INDEX 的同義詞。當在欄位定義中給定時,索引鍵屬性 PRIMARY KEY 也可以僅指定為 KEY。這是為了與其他資料庫系統相容而實作的。

  • UNIQUE

    UNIQUE 索引會建立約束,使索引中的所有值都必須是不同的。如果你嘗試新增索引鍵值與現有列相符的新列,則會發生錯誤。對於所有引擎,UNIQUE 索引允許可包含 NULL 的欄位有多個 NULL 值。如果你在 UNIQUE 索引中為欄位指定前置值,則欄位值必須在前置長度內是唯一的。

    如果資料表具有由單一整數類型欄位組成的 PRIMARY KEYUNIQUE NOT NULL 索引,則你可以在 SELECT 語法中使用 _rowid 來參照索引欄位,如唯一索引中所述。

  • FULLTEXT

    FULLTEXT 索引是一種用於全文搜尋的特殊索引。只有 InnoDBMyISAM 儲存引擎支援 FULLTEXT 索引。它們只能從 CHARVARCHARTEXT 資料行建立。索引總是在整個資料行上建立;不支援資料行前綴索引,且如果指定任何前綴長度都會被忽略。有關操作的詳細資訊,請參閱 第 14.9 節,「全文搜尋函數」。如果全文索引和搜尋操作需要特殊處理,則可以將 WITH PARSER 子句指定為 index_option 值,以將剖析器外掛程式與索引關聯。此子句僅對 FULLTEXT 索引有效。InnoDBMyISAM 支援全文剖析器外掛程式。有關更多資訊,請參閱 全文剖析器外掛程式撰寫全文剖析器外掛程式

  • SPATIAL

    您可以在空間資料類型上建立 SPATIAL 索引。空間類型僅適用於 InnoDBMyISAM 表格,且索引的資料行必須宣告為 NOT NULL。請參閱 第 13.4 節,「空間資料類型」

  • FOREIGN KEY

    MySQL 支援外來鍵,可讓您跨表格交叉參照相關資料,以及外來鍵約束,這有助於保持此分散式資料的一致性。有關定義和選項資訊,請參閱 reference_definitionreference_option

    使用 InnoDB 儲存引擎的分割表格不支援外來鍵。有關更多資訊,請參閱 第 26.6 節,「分割的限制與局限性」

  • CHECK

    CHECK 子句可讓您建立對表格列中的資料值進行檢查的約束。請參閱 第 15.1.20.6 節,「CHECK 約束」

  • key_part

    • key_part 規格可以 ASCDESC 結尾,以指定索引值是以遞增或遞減順序儲存。如果未提供順序指定符,則預設為遞增。

    • 對於使用 REDUNDANTCOMPACT 列格式的 InnoDB 表格,由 length 屬性定義的前綴長度最多可為 767 個位元組。對於使用 DYNAMICCOMPRESSED 列格式的 InnoDB 表格,前綴長度限制為 3072 個位元組。對於 MyISAM 表格,前綴長度限制為 1000 個位元組。

      前綴限制以位元組為單位來測量。但是,CREATE TABLEALTER TABLECREATE INDEX 陳述式中索引規格的前綴長度,對於非二進位字串類型 (CHARVARCHARTEXT) 解釋為字元數,而對於二進位字串類型 (BINARYVARBINARYBLOB) 則解釋為位元組數。在為使用多位元組字元集的非二進位字串資料行指定前綴長度時,請考慮這一點。

    • 用於 key_part 規格的 expr 可以採用 (CAST json_path AS type ARRAY) 的形式,以在 JSON 資料行上建立多值索引。多值索引,提供了關於多值索引的建立、使用以及限制的詳細資訊。

  • index_type

    某些儲存引擎允許您在建立索引時指定索引類型。index_type 指定符的語法為 USING type_name

    範例

    CREATE TABLE lookup
      (id INT, INDEX USING BTREE (id)
    ) ENGINE = MEMORY;

    USING 的慣用位置是在索引資料行清單之後。它可以在資料行清單之前給出,但支援在該位置使用選項已不建議使用,您應該預期它會在未來的 MySQL 版本中移除。

  • index_option

    index_option 值指定索引的其他選項。

    • KEY_BLOCK_SIZE

      對於 MyISAM 表格,KEY_BLOCK_SIZE 可以選擇指定用於索引鍵區塊的大小 (以位元組為單位)。該值被視為提示;如有必要,可以使用不同的大小。為個別索引定義指定的 KEY_BLOCK_SIZE 值會覆寫表格層級的 KEY_BLOCK_SIZE 值。

      有關表格層級 KEY_BLOCK_SIZE 屬性的資訊,請參閱表格選項

    • WITH PARSER

      WITH PARSER 選項只能與 FULLTEXT 索引一起使用。如果全文索引和搜尋操作需要特殊處理,則它會將剖析器外掛程式與索引關聯。InnoDBMyISAM 支援全文剖析器外掛程式。如果您有一個與全文剖析器外掛程式相關聯的 MyISAM 表格,您可以使用 ALTER TABLE 將該表格轉換為 InnoDB

    • 註解

      索引定義可以包含最多 1024 個字元的選用註解。

      您可以使用 index_option COMMENT 子句為個別索引設定 InnoDBMERGE_THRESHOLD 值。請參閱 第 17.8.11 節,「設定索引頁的合併閾值」

    • VISIBLEINVISIBLE

      指定索引可見性。索引預設為可見。最佳化工具不會使用不可見的索引。索引可見性的規格適用於主要索引鍵 (明確或隱含) 以外的索引。有關更多資訊,請參閱 第 10.3.12 節,「不可見的索引」

    • ENGINE_ATTRIBUTESECONDARY_ENGINE_ATTRIBUTE 選項用於指定主要和次要儲存引擎的索引屬性。這些選項保留供將來使用。

    有關允許的 index_option 值的更多資訊,請參閱 第 15.1.15 節,「CREATE INDEX 陳述式」。有關索引的更多資訊,請參閱 第 10.3.1 節,「MySQL 如何使用索引」

  • reference_definition

    有關 reference_definition 語法詳細資訊和範例,請參閱 第 15.1.20.5 節,「FOREIGN KEY 約束」

    InnoDBNDB 表格支援檢查外來鍵約束。被參考表格的資料行必須一律明確命名。支援對外來鍵的 ON DELETEON UPDATE 動作。有關更詳細的資訊和範例,請參閱 第 15.1.20.5 節,「FOREIGN KEY 約束」

    對於其他儲存引擎,MySQL 伺服器會剖析並忽略 CREATE TABLE 陳述式中的 FOREIGN KEY 語法。

    重要

    對於熟悉 ANSI/ISO SQL 標準的使用者,請注意,沒有任何儲存引擎 (包括 InnoDB) 會識別或強制執行參考完整性約束定義中使用的 MATCH 子句。使用明確的 MATCH 子句不會產生指定的效果,並且也會導致 ON DELETEON UPDATE 子句被忽略。由於這些原因,應避免指定 MATCH

    SQL 標準中的 MATCH 子句會控制在與主要索引鍵比較時,如何處理複合 (多資料行) 外來鍵中的 NULL 值。InnoDB 本質上實作了 MATCH SIMPLE 所定義的語義,它允許外來鍵全部或部分為 NULL。在這種情況下,允許插入包含此外來鍵的 (子表格) 列,並且不會比對到被參考 (父表格) 中的任何列。可以使用觸發程序來實作其他語義。

    此外,MySQL 要求被參考的資料行必須建立索引以提高效能。但是,InnoDB 不會強制執行任何要求,要求被參考的資料行宣告為 UNIQUENOT NULL。對於諸如 UPDATEDELETE CASCADE 等操作,針對非唯一索引鍵或包含 NULL 值的索引鍵的外來鍵參考的處理方式並未明確定義。建議您僅使用參考同時為 UNIQUE (或 PRIMARY) 和 NOT NULL 的索引鍵的外來鍵。

    MySQL 會剖析但忽略「內嵌的 REFERENCES 規格」(如 SQL 標準中所定義),其中參考是定義為資料行規格的一部分。MySQL 僅在指定為單獨的 FOREIGN KEY 規格的一部分時,才接受 REFERENCES 子句。有關更多資訊,請參閱 第 1.7.2.3 節,「FOREIGN KEY 約束差異」

  • reference_option

    有關 RESTRICTCASCADESET NULLNO ACTIONSET DEFAULT 選項的資訊,請參閱 第 15.1.20.5 節,「FOREIGN KEY 約束」

表格選項

表格選項用於最佳化表格的行為。在大多數情況下,您不必指定任何選項。這些選項適用於所有儲存引擎,除非另有說明。不適用於特定儲存引擎的選項可能會被接受並記住為表格定義的一部分。如果稍後使用 ALTER TABLE 來轉換表格以使用不同的儲存引擎,則這些選項會套用。

  • ENGINE

    指定表格的儲存引擎,使用下表中顯示的其中一個名稱。引擎名稱可以不加引號或加引號。加引號的名稱 'DEFAULT' 會被識別,但會被忽略。

    儲存引擎 描述
    InnoDB 具有列鎖定和外部索引的交易安全表格。新表格的預設儲存引擎。請參閱 第 17 章,InnoDB 儲存引擎,尤其是如果您有 MySQL 經驗但對 InnoDB 不熟悉,請參閱 第 17.1 節,“InnoDB 簡介”
    MyISAM 二進位可移植儲存引擎,主要用於唯讀或幾乎唯讀的工作負載。請參閱 第 18.2 節,“MyISAM 儲存引擎”
    MEMORY 此儲存引擎的資料僅儲存在記憶體中。請參閱 第 18.3 節,“MEMORY 儲存引擎”
    CSV 以逗號分隔值格式儲存列的表格。請參閱 第 18.4 節,“CSV 儲存引擎”
    ARCHIVE 封存儲存引擎。請參閱 第 18.5 節,“ARCHIVE 儲存引擎”
    EXAMPLE 範例引擎。請參閱 第 18.9 節,“EXAMPLE 儲存引擎”
    FEDERATED 存取遠端表格的儲存引擎。請參閱 第 18.8 節,“FEDERATED 儲存引擎”
    HEAP 這是 MEMORY 的同義詞。
    MERGE 用作一個表格的 MyISAM 表格集合。也稱為 MRG_MyISAM。請參閱 第 18.7 節,“MERGE 儲存引擎”
    NDB 叢集、容錯、基於記憶體的表格,支援交易和外部索引。也稱為 NDBCLUSTER。請參閱 第 25 章,MySQL NDB Cluster 8.4

    預設情況下,如果指定的儲存引擎不可用,則陳述式會失敗並出現錯誤。您可以從伺服器 SQL 模式中移除 NO_ENGINE_SUBSTITUTION(請參閱 第 7.1.11 節,“伺服器 SQL 模式”)來覆寫此行為,以便 MySQL 允許將指定的引擎替換為預設儲存引擎。通常在這種情況下,這是 InnoDB,它是 default_storage_engine 系統變數的預設值。當 NO_ENGINE_SUBSTITUTION 停用時,如果儲存引擎規格未被遵循,則會發生警告。

  • AUTOEXTEND_SIZE

    定義當 InnoDB 表空間變滿時,其擴展表空間大小的量。設定值必須是 4MB 的倍數。預設設定值為 0,這會導致表空間根據隱含的預設行為擴展。如需更多資訊,請參閱 第 17.6.3.9 節,“表空間 AUTOEXTEND_SIZE 配置”

  • AUTO_INCREMENT

    表格的初始 AUTO_INCREMENT 值。在 MySQL 8.4 中,這適用於 MyISAMMEMORYInnoDBARCHIVE 表格。若要為不支援 AUTO_INCREMENT 表格選項的引擎設定第一個自動遞增值,請在建立表格後插入一個值比所需值少一的虛擬列,然後刪除虛擬列。

    對於在 CREATE TABLE 陳述式中支援 AUTO_INCREMENT 表格選項的引擎,您也可以使用 ALTER TABLE tbl_name AUTO_INCREMENT = N 來重設 AUTO_INCREMENT 值。該值不能設定為低於目前欄中的最大值。

  • AVG_ROW_LENGTH

    表格的平均列長度近似值。您只需要為具有可變大小列的大型表格設定此值。

    當您建立 MyISAM 表格時,MySQL 會使用 MAX_ROWSAVG_ROW_LENGTH 選項的乘積來決定產生的表格有多大。如果您沒有指定任何選項,則 MyISAM 資料和索引檔案的最大大小預設為 256TB。(如果您的作業系統不支援如此大的檔案,則表格大小會受到檔案大小限制。)如果您想要縮小指標大小以使索引更小更快,並且您真的不需要大檔案,則可以透過設定 myisam_data_pointer_size 系統變數來減小預設指標大小。(請參閱 第 7.1.8 節,“伺服器系統變數”。)如果您希望所有表格都能夠成長到超過預設限制,並且願意讓您的表格比必要時稍微慢一些且更大一些,則可以透過設定此變數來增加預設指標大小。將該值設定為 7 允許表格大小最大為 65,536TB。

  • [DEFAULT] CHARACTER SET

    指定表格的預設字元集。CHARSETCHARACTER SET 的同義詞。如果字元集名稱為 DEFAULT,則會使用資料庫字元集。

  • CHECKSUM

    如果您希望 MySQL 為所有列維護即時校驗和(也就是說,當表格變更時 MySQL 會自動更新的校驗和),則將此值設定為 1。這會使表格更新速度稍慢,但也更容易找到損壞的表格。CHECKSUM TABLE 陳述式會報告校驗和。(僅限 MyISAM。)

  • [DEFAULT] COLLATE

    指定表格的預設排序規則。

  • 註解

    表格的註解,最多 2048 個字元。

    您可以使用 table_option COMMENT 子句為表格設定 InnoDB MERGE_THRESHOLD 值。請參閱 第 17.8.11 節,“設定索引頁面的合併臨界值”

    設定 NDB_TABLE 選項。 在建立 NDB 表格的 CREATE TABLE 中或變更表格的 ALTER TABLE 陳述式中的表格註解,也可以用來將 NDB_TABLE 選項 NOLOGGINGREAD_BACKUPPARTITION_BALANCEFULLY_REPLICATED 中的一到四個指定為一組名稱-值對,如果需要,以逗號分隔,緊接著引號註解文字開頭的字串 NDB_TABLE=。此處顯示使用此語法的範例陳述式(強調文字)

    CREATE TABLE t1 (
        c1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
        c2 VARCHAR(100),
        c3 VARCHAR(100) )
    ENGINE=NDB
    COMMENT="NDB_TABLE=READ_BACKUP=0,PARTITION_BALANCE=FOR_RP_BY_NODE";

    引號字串內不允許空格。該字串不區分大小寫。

    註解會顯示為 SHOW CREATE TABLE 輸出的一部分。註解的文字也可用作 MySQL Information Schema TABLES 表格的 TABLE_COMMENT 欄。

    此註解語法也支援用於 NDB 表格的 ALTER TABLE 陳述式。請記住,用於 ALTER TABLE 的表格註解會取代表格先前可能擁有的任何現有註解。

    在表格註解中設定 MERGE_THRESHOLD 選項不支援用於 NDB 表格(它會被忽略)。

    如需完整的語法資訊和範例,請參閱 第 15.1.20.12 節,“設定 NDB 註解選項”

  • COMPRESSION

    用於 InnoDB 表格的頁面級壓縮的壓縮演算法。支援的值包括 ZlibLZ4NoneCOMPRESSION 屬性是隨著透明頁面壓縮功能引入的。頁面壓縮僅支援位於file-per-table 表空間中的 InnoDB 表格,並且僅在支援稀疏檔案和挖洞的 Linux 和 Windows 平台上可用。如需更多資訊,請參閱 第 17.9.2 節,“InnoDB 頁面壓縮”

  • CONNECTION

    FEDERATED 表格的連線字串。

    請注意

    舊版 MySQL 使用 COMMENT 選項來作為連線字串。

  • DATA DIRECTORYINDEX DIRECTORY

    對於 InnoDBDATA DIRECTORY='directory' 子句允許在資料目錄之外建立表格。必須啟用 innodb_file_per_table 變數才能使用 DATA DIRECTORY 子句。必須指定完整的目錄路徑,並且 InnoDB 必須知道此路徑。如需更多資訊,請參閱 第 17.6.1.2 節,“在外部建立表格”

    建立 MyISAM 表格時,您可以使用 DATA DIRECTORY='directory' 子句、INDEX DIRECTORY='directory' 子句或兩者。它們分別指定將 MyISAM 表格的資料檔案和索引檔案放置在哪裡。與 InnoDB 表格不同,MySQL 在使用 DATA DIRECTORYINDEX DIRECTORY 選項建立 MyISAM 表格時,不會建立與資料庫名稱對應的子目錄。檔案會建立在指定的目錄中。

    您必須具有 FILE 權限才能使用 DATA DIRECTORYINDEX DIRECTORY 表格選項。

    重要

    對於分割表格,會忽略表格層級的 DATA DIRECTORYINDEX DIRECTORY 選項。(錯誤 #32091)

    這些選項僅在您未使用 --skip-symbolic-links 選項時才有效。您的作業系統也必須具備可運作且具執行緒安全性的 realpath() 呼叫。如需更完整的資訊,請參閱章節 10.12.2.2,「在 Unix 上為 MyISAM 表格使用符號連結」

    如果建立 MyISAM 表格時沒有 DATA DIRECTORY 選項,則 .MYD 檔案會建立在資料庫目錄中。預設情況下,如果 MyISAM 在此情況下找到現有的 .MYD 檔案,它會覆寫該檔案。這也適用於沒有 INDEX DIRECTORY 選項所建立表格的 .MYI 檔案。若要抑制此行為,請使用 --keep_files_on_create 選項啟動伺服器,在此情況下,MyISAM 不會覆寫現有的檔案,而是傳回錯誤。

    如果建立 MyISAM 表格時使用 DATA DIRECTORYINDEX DIRECTORY 選項,並且找到現有的 .MYD.MYI 檔案,MyISAM 一律會傳回錯誤,且不會覆寫指定目錄中的檔案。

    重要

    您無法將包含 MySQL 資料目錄的路徑名稱與 DATA DIRECTORYINDEX DIRECTORY 一起使用。這包括分割表格和個別表格分割區。(請參閱錯誤 #32167。)

  • DELAY_KEY_WRITE

    如果您想要延遲表格的索引更新直到表格關閉,請將此選項設定為 1。請參閱章節 7.1.8,「伺服器系統變數」delay_key_write 系統變數的描述。(僅限 MyISAM。)

  • ENCRYPTION

    ENCRYPTION 子句可為 InnoDB 表格啟用或停用頁面層級的資料加密。必須先安裝並設定金鑰環外掛程式,才能啟用加密。ENCRYPTION 子句可以在以每個表格為單位建立表格空間時建立表格,或是在一般表格空間中建立表格時指定。

    如果未指定 ENCRYPTION 子句,表格會繼承預設的結構描述加密。如果啟用 table_encryption_privilege_check 變數,則需要 TABLE_ENCRYPTION_ADMIN 權限,才能建立具有與預設結構描述加密不同的 ENCRYPTION 子句設定的表格。在一般表格空間中建立表格時,表格和表格空間的加密必須相符。

    使用不支援加密的儲存引擎時,不允許指定值不是 'N'''ENCRYPTION 子句。

    如需詳細資訊,請參閱章節 17.13,「InnoDB 靜態資料加密」

  • ENGINE_ATTRIBUTESECONDARY_ENGINE_ATTRIBUTE 選項是用於指定主要和次要儲存引擎的表格屬性。這些選項保留供未來使用。

    指派給這些選項的任何值都必須是包含有效 JSON 文件或空字串 ('') 的字串文字。無效的 JSON 會被拒絕。

    CREATE TABLE t1 (c1 INT) ENGINE_ATTRIBUTE='{"key":"value"}';

    ENGINE_ATTRIBUTESECONDARY_ENGINE_ATTRIBUTE 值可以重複指定而不會發生錯誤。在這種情況下,會使用最後指定的值。

    ENGINE_ATTRIBUTESECONDARY_ENGINE_ATTRIBUTE 值不會被伺服器檢查,也不會在資料表的儲存引擎變更時被清除。

  • INSERT_METHOD

    如果您想要將資料插入 MERGE 表格中,您必須使用 INSERT_METHOD 指定應該將列插入其中的表格。INSERT_METHOD 是僅適用於 MERGE 表格的選項。使用 FIRSTLAST 值,讓插入項目進入第一個或最後一個表格,或使用 NO 值以防止插入。請參閱章節 18.7,「MERGE 儲存引擎」

  • KEY_BLOCK_SIZE

    對於 MyISAM 表格,KEY_BLOCK_SIZE 可以選擇指定用於索引鍵區塊的大小 (以位元組為單位)。該值被視為提示;如有必要,可以使用不同的大小。為個別索引定義指定的 KEY_BLOCK_SIZE 值會覆寫表格層級的 KEY_BLOCK_SIZE 值。

    對於 InnoDB 表格,KEY_BLOCK_SIZE 指定用於壓縮 InnoDB 表格的頁面大小 (以 KB 為單位)。KEY_BLOCK_SIZE 值會被視為提示;如有必要,InnoDB 可以使用不同的大小。KEY_BLOCK_SIZE 只能小於或等於 innodb_page_size 值。值 0 代表預設的壓縮頁面大小,即 innodb_page_size 值的一半。根據 innodb_page_size,可能的 KEY_BLOCK_SIZE 值包括 0、1、2、4、8 和 16。如需詳細資訊,請參閱章節 17.9.1,「InnoDB 表格壓縮」

    Oracle 建議在為 InnoDB 表格指定 KEY_BLOCK_SIZE 時啟用 innodb_strict_mode。啟用 innodb_strict_mode 時,指定無效的 KEY_BLOCK_SIZE 值會傳回錯誤。如果停用 innodb_strict_mode,無效的 KEY_BLOCK_SIZE 值會導致警告,且會忽略 KEY_BLOCK_SIZE 選項。

    回應 SHOW TABLE STATUS 時的 Create_options 資料行,會報告表格所使用的實際 KEY_BLOCK_SIZESHOW CREATE TABLE 也是如此。

    InnoDB 僅在表格層級支援 KEY_BLOCK_SIZE

    使用 32KB 和 64KB innodb_page_size 值時,不支援 KEY_BLOCK_SIZEInnoDB 表格壓縮不支援這些頁面大小。

    InnoDB 在建立暫存表格時不支援 KEY_BLOCK_SIZE 選項。

  • MAX_ROWS

    您計畫在表格中儲存的最大列數。這不是硬性限制,而是向儲存引擎提示表格必須能夠儲存至少這麼多列。

    重要

    MAX_ROWSNDB 表格一起使用以控制表格分割區的數量已棄用。在後續版本中仍支援此選項以提供回溯相容性,但在未來的版本中可能會移除此選項。請改用 PARTITION_BALANCE;請參閱設定 NDB_TABLE 選項

    NDB 儲存引擎將此值視為最大值。如果您計畫建立非常大的 NDB Cluster 表格 (包含數百萬列),您應該使用此選項來確保 NDB 在用於儲存表格主索引鍵雜湊的雜湊表中,配置足夠數量的索引插槽,方法是設定 MAX_ROWS = 2 * rows,其中 rows 是您預期插入表格中的列數。

    最大 MAX_ROWS 值為 4294967295;較大的值會截斷至此限制。

  • MIN_ROWS

    您計畫在表格中儲存的最小列數。MEMORY 儲存引擎會使用此選項作為記憶體使用量的提示。

  • PACK_KEYS

    僅適用於 MyISAM 表格。如果您想要較小的索引,請將此選項設定為 1。這通常會使更新速度變慢,讀取速度變快。將此選項設定為 0 會停用索引的所有壓縮。將其設定為 DEFAULT 會告知儲存引擎僅壓縮長的 CHARVARCHARBINARYVARBINARY 資料行。

    如果您未使用 PACK_KEYS,則預設為壓縮字串,但不壓縮數字。如果您使用 PACK_KEYS=1,則也會壓縮數字。

    壓縮二進位數字索引鍵時,MySQL 會使用前置壓縮

    • 每個索引鍵都需要一個額外的位元組來指出下一個索引鍵有多少個位元組與先前的索引鍵相同。

    • 列的指標會直接儲存在索引鍵之後 (高位元組優先順序),以改善壓縮。

    這表示如果您在兩個連續的列上有許多相同的索引鍵,則所有後續 相同 的索引鍵通常只會佔用兩個位元組 (包括列的指標)。將其與下列索引鍵佔用 storage_size_for_key + pointer_size 的一般情況相比 (其中指標大小通常為 4)。反之,只有在有許多相同的數字時,您才能從前置壓縮中獲得顯著的好處。如果所有索引鍵都完全不同,如果索引鍵不是可以有 NULL 值的索引鍵,則每個索引鍵會多使用一個位元組。(在此情況下,壓縮的索引鍵長度會儲存在同一個位元組中,該位元組用於標記索引鍵是否為 NULL。)

  • PASSWORD

    此選項未使用。

  • ROW_FORMAT

    定義儲存資料列的實體格式。

    當建立資料表時,若嚴格模式停用,且指定的資料列格式不被支援,則會使用儲存引擎的預設資料列格式。資料表的實際資料列格式會在執行SHOW TABLE STATUS 指令後,於 Row_format 欄位中回報。而 Create_options 欄位則會顯示在 CREATE TABLE 指令中指定的資料列格式,如同 SHOW CREATE TABLE 指令的結果。

    資料列格式的選擇會因資料表所使用的儲存引擎而異。

    對於 InnoDB 資料表

    • 預設的資料列格式由 innodb_default_row_format 定義,其預設值為 DYNAMIC。當 ROW_FORMAT 選項未定義或使用 ROW_FORMAT=DEFAULT 時,將使用預設的資料列格式。

      如果 ROW_FORMAT 選項未定義,或使用 ROW_FORMAT=DEFAULT,重新建構資料表的操作也會默默地將資料表的資料列格式更改為由 innodb_default_row_format 定義的預設值。 更多資訊,請參閱定義資料表的資料列格式

    • 為了更有效率地儲存 InnoDB 資料類型,特別是 BLOB 類型,請使用 DYNAMIC。有關 DYNAMIC 資料列格式的相關要求,請參閱DYNAMIC 資料列格式

    • 若要為 InnoDB 資料表啟用壓縮,請指定 ROW_FORMAT=COMPRESSED。建立暫時表格時不支援 ROW_FORMAT=COMPRESSED 選項。有關 COMPRESSED 資料列格式的相關要求,請參閱第 17.9 節,「InnoDB 資料表和頁面壓縮」

    • 透過指定 REDUNDANT 資料列格式,仍可要求使用較舊版本 MySQL 中使用的資料列格式。

    • 當您指定非預設的 ROW_FORMAT 子句時,也請考慮啟用 innodb_strict_mode 組態選項。

    • 不支援 ROW_FORMAT=FIXED。如果停用 innodb_strict_mode 時指定 ROW_FORMAT=FIXEDInnoDB 會發出警告並假設為 ROW_FORMAT=DYNAMIC。如果在啟用 innodb_strict_mode (預設為啟用)時指定 ROW_FORMAT=FIXED,則 InnoDB 會傳回錯誤。

    • 有關 InnoDB 資料列格式的其他資訊,請參閱第 17.10 節,「InnoDB 資料列格式」

    對於 MyISAM 資料表,選項值可以是 FIXEDDYNAMIC,分別表示靜態或可變長度的資料列格式。myisampack 將類型設定為 COMPRESSED。請參閱第 18.2.3 節,「MyISAM 資料表儲存格式」

    對於 NDB 資料表,預設的 ROW_FORMATDYNAMIC

  • START TRANSACTION

    這是一個內部使用的資料表選項,用於在使用支援原子 DDL 的儲存引擎進行基於列複製時,允許將 CREATE TABLE ... SELECT 記錄為二進制日誌中的單個原子交易。在 CREATE TABLE ... START TRANSACTION 之後,僅允許 BINLOGCOMMITROLLBACK 指令。有關相關資訊,請參閱第 15.1.1 節,「原子資料定義指令支援」

  • STATS_AUTO_RECALC

    指定是否自動重新計算 InnoDB 資料表的持續性統計資訊DEFAULT 值會使資料表的持續性統計資訊設定由 innodb_stats_auto_recalc 組態選項決定。當資料表中的 10% 資料變更時,1 值會使統計資訊重新計算。0 值則會禁止此資料表的自動重新計算;使用此設定,在對資料表進行重大變更後,發出 ANALYZE TABLE 指令以重新計算統計資訊。有關持續性統計資訊功能的更多資訊,請參閱第 17.8.10.1 節,「設定持續性最佳化工具統計資訊參數」

  • STATS_PERSISTENT

    指定是否為 InnoDB 資料表啟用持續性統計資訊DEFAULT 值會使資料表的持續性統計資訊設定由 innodb_stats_persistent 組態選項決定。1 值會啟用資料表的持續性統計資訊,而 0 值則會關閉此功能。透過 CREATE TABLEALTER TABLE 指令啟用持續性統計資訊後,在將代表性資料載入到資料表之後,請發出 ANALYZE TABLE 指令以計算統計資訊。有關持續性統計資訊功能的更多資訊,請參閱第 17.8.10.1 節,「設定持續性最佳化工具統計資訊參數」

  • STATS_SAMPLE_PAGES

    在估計索引欄位的基數和其他統計資訊時,例如由 ANALYZE TABLE 計算的索引欄位,要取樣的索引頁面數。更多資訊,請參閱第 17.8.10.1 節,「設定持續性最佳化工具統計資訊參數」

  • TABLESPACE

    TABLESPACE 子句可用於在現有的通用資料表空間、單一資料表資料表空間或系統資料表空間中建立 InnoDB 資料表。

    CREATE TABLE tbl_name ... TABLESPACE [=] tablespace_name

    您指定的通用資料表空間在使用 TABLESPACE 子句之前必須已存在。有關通用資料表空間的資訊,請參閱第 17.6.3.3 節,「通用資料表空間」

    tablespace_name 是一個區分大小寫的識別符。它可以加上或不加上引號。不允許使用正斜線字元(/)。以 innodb_ 開頭的名稱保留用於特殊用途。

    若要在系統資料表空間中建立資料表,請指定 innodb_system 作為資料表空間名稱。

    CREATE TABLE tbl_name ... TABLESPACE [=] innodb_system

    使用 TABLESPACE [=] innodb_system,您可以在系統資料表空間中放置任何未壓縮資料列格式的資料表,而無論 innodb_file_per_table 設定為何。例如,您可以使用 TABLESPACE [=] innodb_system 將具有 ROW_FORMAT=DYNAMIC 的資料表新增到系統資料表空間。

    若要在單一資料表資料表空間中建立資料表,請指定 innodb_file_per_table 作為資料表空間名稱。

    CREATE TABLE tbl_name ... TABLESPACE [=] innodb_file_per_table
    請注意

    如果啟用 innodb_file_per_table,則無需指定 TABLESPACE=innodb_file_per_table 來建立 InnoDB 單一資料表資料表空間。當啟用 innodb_file_per_table 時,InnoDB 資料表預設會在單一資料表資料表空間中建立。

    DATA DIRECTORY 子句允許與 CREATE TABLE ... TABLESPACE=innodb_file_per_table 一起使用,但其他情況下不支援與 TABLESPACE 子句結合使用。在 DATA DIRECTORY 子句中指定的目錄必須為 InnoDB 所知。更多資訊,請參閱使用 DATA DIRECTORY 子句

    請注意

    不建議將 TABLESPACE = innodb_file_per_tableTABLESPACE = innodb_temporary 子句與 CREATE TEMPORARY TABLE 一起使用;預計會在未來版本的 MySQL 中移除。

    STORAGE 資料表選項僅適用於 NDB 資料表。STORAGE 決定使用的儲存類型,可以是 DISKMEMORY

    TABLESPACE ... STORAGE DISK 將資料表指派給 NDB Cluster 磁碟資料資料表空間。除非在 CREATE TABLE 中前面有 TABLESPACE tablespace_name,否則不能使用 STORAGE DISK

    對於 STORAGE MEMORY,資料表空間名稱是選用的,因此,您可以使用 TABLESPACE tablespace_name STORAGE MEMORY 或直接使用 STORAGE MEMORY 來明確指定資料表在記憶體中。

    請參閱第 25.6.11 節,〈NDB Cluster 磁碟資料表〉,以取得更多資訊。

  • UNION

    用於將一組相同的 MyISAM 資料表當作一個來存取。這僅適用於 MERGE 資料表。請參閱第 18.7 節,〈MERGE 儲存引擎〉

    您必須對應到 MERGE 資料表的資料表擁有 SELECTUPDATEDELETE 權限。

    請注意

    先前,所有使用的資料表都必須與 MERGE 資料表本身位於相同的資料庫中。這個限制已不再適用。

資料表分割

partition_options 可用於控制使用 CREATE TABLE 建立的資料表分割。

本節開頭語法中顯示的 partition_options 並非所有分割類型都可用。請參閱下列各個類型的清單,以取得各種類型的特定資訊,並參閱第 26 章,分割,以取得有關 MySQL 分割的運作方式和用途的更完整資訊,以及與 MySQL 分割相關的資料表建立和其他陳述式的其他範例。

可以修改、合併、新增至資料表和從資料表中刪除分割區。如需有關完成這些工作的 MySQL 陳述式的基本資訊,請參閱第 15.1.9 節,〈ALTER TABLE 陳述式〉。如需更詳細的描述和範例,請參閱第 26.3 節,〈分割區管理〉

  • PARTITION BY

    如果使用,partition_options 子句會以 PARTITION BY 開頭。此子句包含用於決定分割區的函式;此函式會傳回 1 到 num 的整數值,其中 num 是分割區的數量。(資料表可能包含的使用者定義分割區的最大數量為 1024;子分割區(稍後將在本節中討論)的數量包含在此最大值中。)

    請注意

    PARTITION BY 子句中使用的運算式 (expr) 不能參考正在建立的資料表中的任何欄位;明確不允許此類參考,並會導致陳述式失敗並出現錯誤。(錯誤 #29444)

  • HASH(expr)

    雜湊一個或多個欄位,以建立用於放置和尋找列的索引鍵。expr 是使用一個或多個資料表欄位的運算式。這可以是任何有效的 MySQL 運算式(包括產生單一整數值的 MySQL 函式)。例如,這些都是使用 PARTITION BY HASH 的有效 CREATE TABLE 陳述式

    CREATE TABLE t1 (col1 INT, col2 CHAR(5))
        PARTITION BY HASH(col1);
    
    CREATE TABLE t1 (col1 INT, col2 CHAR(5), col3 DATETIME)
        PARTITION BY HASH ( YEAR(col3) );

    您不得將 VALUES LESS THANVALUES IN 子句與 PARTITION BY HASH 一起使用。

    PARTITION BY HASH 使用 expr 除以分割區數量(也就是模數)的餘數。如需範例和額外資訊,請參閱第 26.2.4 節,〈HASH 分割〉

    LINEAR 關鍵字需要稍微不同的演算法。在這種情況下,儲存列的分割區編號是透過一個或多個邏輯 AND 運算來計算的。如需線性雜湊的討論和範例,請參閱第 26.2.4.1 節,〈線性 HASH 分割〉

  • KEY(column_list)

    這類似於 HASH,但 MySQL 會提供雜湊函式以確保資料平均分配。column_list 引數只是一個或多個資料表欄位的清單(最多 16 個)。此範例顯示一個簡單的資料表,該資料表依索引鍵分割,有 4 個分割區

    CREATE TABLE tk (col1 INT, col2 CHAR(5), col3 DATE)
        PARTITION BY KEY(col3)
        PARTITIONS 4;

    對於依索引鍵分割的資料表,您可以使用 LINEAR 關鍵字來採用線性分割。這與依 HASH 分割的資料表具有相同的效果。也就是說,分割區編號是使用 & 運算子而不是模數來尋找的(詳細資訊請參閱第 26.2.4.1 節,〈線性 HASH 分割〉,以及第 26.2.5 節,〈索引鍵分割〉)。此範例使用線性依索引鍵分割,以在 5 個分割區之間分配資料

    CREATE TABLE tk (col1 INT, col2 CHAR(5), col3 DATE)
        PARTITION BY LINEAR KEY(col3)
        PARTITIONS 5;

    [SUB]PARTITION BY [LINEAR] KEY 支援 ALGORITHM={1 | 2} 選項。ALGORITHM=1 會導致伺服器使用與 MySQL 5.1 相同的索引鍵雜湊函式;ALGORITHM=2 表示伺服器採用 MySQL 5.5 和更新版本中新 KEY 分割資料表預設實作和使用的索引鍵雜湊函式。(使用 MySQL 5.5 和更新版本中採用的索引鍵雜湊函式建立的分割資料表不能由 MySQL 5.1 伺服器使用。)不指定選項與使用 ALGORITHM=2 的效果相同。此選項的主要用途是升級或降級 MySQL 5.1 和更新的 MySQL 版本之間的 [LINEAR] KEY 分割資料表,或在 MySQL 5.5 或更新的伺服器上建立可於 MySQL 5.1 伺服器上使用的依 KEYLINEAR KEY 分割的資料表。如需更多資訊,請參閱第 15.1.9.1 節,〈ALTER TABLE 分割區運算〉

    mysqldump 會將此選項寫入版本化的註解中。

    SHOW CREATE TABLE 的輸出中,會在必要時以版本化的註解顯示 ALGORITHM=1,方式與 mysqldump 相同。即使在建立原始資料表時指定了此選項,ALGORITHM=2 也會一律從 SHOW CREATE TABLE 輸出中省略。

    您不得將 VALUES LESS THANVALUES IN 子句與 PARTITION BY KEY 一起使用。

  • RANGE(expr)

    在這種情況下,expr 會使用一組 VALUES LESS THAN 運算子顯示值的範圍。使用範圍分割時,您必須使用 VALUES LESS THAN 定義至少一個分割區。您不能將 VALUES IN 用於範圍分割。

    請注意

    對於依 RANGE 分割的資料表,VALUES LESS THAN 必須與整數常值或評估為單一整數值的運算式一起使用。在 MySQL 8.4 中,您可以使用 PARTITION BY RANGE COLUMNS 定義的資料表克服此限制,如下文所述。

    假設您有一個資料表,您希望根據以下方案依包含年份值的欄位進行分割。

    分割區編號 年份範圍
    0 1990 年及更早
    1 1991 年至 1994 年
    2 1995 年至 1998 年
    3 1999 年至 2002 年
    4 2003 年至 2005 年
    5 2006 年及更晚

    可以使用此處顯示的 CREATE TABLE 陳述式來實現實作此類分割方案的資料表

    CREATE TABLE t1 (
        year_col  INT,
        some_data INT
    )
    PARTITION BY RANGE (year_col) (
        PARTITION p0 VALUES LESS THAN (1991),
        PARTITION p1 VALUES LESS THAN (1995),
        PARTITION p2 VALUES LESS THAN (1999),
        PARTITION p3 VALUES LESS THAN (2002),
        PARTITION p4 VALUES LESS THAN (2006),
        PARTITION p5 VALUES LESS THAN MAXVALUE
    );

    PARTITION ... VALUES LESS THAN ... 陳述式以連續方式運作。VALUES LESS THAN MAXVALUE 可用來指定大於其他指定最大值的剩餘值。

    VALUES LESS THAN 子句的運作方式與 switch ... case 區塊的 case 部分類似(在許多程式設計語言(如 C、Java 和 PHP)中都可以找到)。也就是說,子句的排列方式必須使每個後續 VALUES LESS THAN 中指定的上限大於前一個,並在清單中,參考 MAXVALUE 的子句排在最後。

  • RANGE COLUMNS(column_list)

    RANGE 變體有助於對在多個欄位上使用範圍條件的查詢進行分割區修剪(也就是說,具有 WHERE a = 1 AND b < 10WHERE a = 1 AND b = 10 AND c < 10 等條件)。它可以讓您在 COLUMNS 子句中使用欄位清單,並在每個 PARTITION ... VALUES LESS THAN (value_list) 分割區定義子句中使用一組欄位值,來指定多個欄位中的值範圍。(在最簡單的情況下,此集合由單一欄位組成。)在 column_listvalue_list 中可參考的最大欄位數為 16 個。

    COLUMNS 子句中使用的 column_list 只能包含欄位名稱;清單中的每個欄位都必須是以下 MySQL 資料類型之一:整數類型;字串類型;以及時間或日期欄位類型。不允許使用 BLOBTEXTSETENUMBIT 或空間資料類型;也不允許使用浮點數類型的欄位。您也不得在 COLUMNS 子句中使用函式或算術運算式。

    分割區定義中使用的 VALUES LESS THAN 子句必須為 COLUMNS() 子句中出現的每個欄位指定常值;也就是說,用於每個 VALUES LESS THAN 子句的值清單必須包含與 COLUMNS 子句中列出的欄位數相同的數量。嘗試在 VALUES LESS THAN 子句中使用比 COLUMNS 子句中更多的值或更少的值,會導致陳述式失敗並出現錯誤分割區欄位清單使用方式不一致...。您不能將 NULL 用於 VALUES LESS THAN 中出現的任何值。對於第一個以外的指定欄位,可以多次使用 MAXVALUE,如此範例所示

    CREATE TABLE rc (
        a INT NOT NULL,
        b INT NOT NULL
    )
    PARTITION BY RANGE COLUMNS(a,b) (
        PARTITION p0 VALUES LESS THAN (10,5),
        PARTITION p1 VALUES LESS THAN (20,10),
        PARTITION p2 VALUES LESS THAN (50,MAXVALUE),
        PARTITION p3 VALUES LESS THAN (65,MAXVALUE),
        PARTITION p4 VALUES LESS THAN (MAXVALUE,MAXVALUE)
    );

    VALUES LESS THAN 值清單中使用的每個值都必須與對應欄位的類型完全符合;不會進行任何轉換。例如,您不能將字串 '1' 用於與使用整數類型的欄位匹配的值(您必須改為使用數字 1),也不能將數字 1 用於與使用字串類型的欄位匹配的值(在這種情況下,您必須使用帶引號的字串:'1')。

    如需更多資訊,請參閱第 26.2.1 節,〈範圍分割〉,以及第 26.4 節,〈分割區修剪〉

  • LIST(expr)

    當根據具有限定可能值的表格欄位(例如州或國家代碼)來分配分割區時,這會很有用。在這種情況下,可以將屬於特定州或國家/地區的所有列分配到單一分割區,或為一組特定的州或國家/地區保留一個分割區。它與 RANGE 類似,但除了 VALUES IN 之外,不能使用其他方式指定每個分割區允許的值。

    VALUES IN 用於與要比對的值列表。例如,您可以建立如下的分割區架構:

    CREATE TABLE client_firms (
        id   INT,
        name VARCHAR(35)
    )
    PARTITION BY LIST (id) (
        PARTITION r0 VALUES IN (1, 5, 9, 13, 17, 21),
        PARTITION r1 VALUES IN (2, 6, 10, 14, 18, 22),
        PARTITION r2 VALUES IN (3, 7, 11, 15, 19, 23),
        PARTITION r3 VALUES IN (4, 8, 12, 16, 20, 24)
    );

    使用列表分割區時,您必須至少使用 VALUES IN 定義一個分割區。您不能將 VALUES LESS THANPARTITION BY LIST 一起使用。

    請注意

    對於以 LIST 分割的表格,與 VALUES IN 一起使用的值列表必須僅包含整數值。在 MySQL 8.4 中,您可以使用 LIST COLUMNS 分割來克服此限制,這將在本節稍後描述。

  • LIST COLUMNS(column_list)

    LIST 的變體有助於對使用多個欄位上的比較條件的查詢進行分割區修剪(亦即,具有諸如 WHERE a = 5 AND b = 5WHERE a = 1 AND b = 10 AND c = 5 的條件)。它允許您藉由在 COLUMNS 子句中使用欄位列表,以及在每個 PARTITION ... VALUES IN (value_list) 分割區定義子句中使用一組欄位值來指定多個欄位中的值。

    用於 LIST COLUMNS(column_list) 的欄位列表和用於 VALUES IN(value_list) 的值列表的資料類型規則,與用於 RANGE COLUMNS(column_list) 的欄位列表和用於 VALUES LESS THAN(value_list) 的值列表相同,但 VALUES IN 子句中不允許使用 MAXVALUE,並且您可以使用 NULL

    VALUES INPARTITION BY LIST COLUMNS 一起使用時,與 PARTITION BY LIST 一起使用時,兩者的值列表之間存在一個重要的差異。當與 PARTITION BY LIST COLUMNS 一起使用時,VALUES IN 子句中的每個元素都必須是欄位值的集合;每個集合中的值數量必須與 COLUMNS 子句中使用的欄位數量相同,並且這些值的資料類型必須與欄位的資料類型匹配(並以相同的順序出現)。在最簡單的情況下,集合由單一欄位組成。在 column_list 和構成 value_list 的元素中,可以使用的最大欄位數為 16 個。

    以下 CREATE TABLE 陳述式定義的表格提供使用 LIST COLUMNS 分割的表格範例:

    CREATE TABLE lc (
        a INT NULL,
        b INT NULL
    )
    PARTITION BY LIST COLUMNS(a,b) (
        PARTITION p0 VALUES IN( (0,0), (NULL,NULL) ),
        PARTITION p1 VALUES IN( (0,1), (0,2), (0,3), (1,1), (1,2) ),
        PARTITION p2 VALUES IN( (1,0), (2,0), (2,1), (3,0), (3,1) ),
        PARTITION p3 VALUES IN( (1,3), (2,2), (2,3), (3,2), (3,3) )
    );
  • PARTITIONS num

    可以選擇使用 PARTITIONS num 子句指定分割區的數量,其中 num 是分割區的數量。如果同時使用此子句任何 PARTITION 子句,則 num 必須等於使用 PARTITION 子句宣告的任何分割區的總數。

    請注意

    無論您在建立以 RANGELIST 分割的表格時是否使用 PARTITIONS 子句,您仍然必須在表格定義中包含至少一個 PARTITION VALUES 子句(請參閱下文)。

  • SUBPARTITION BY

    可以選擇將分割區劃分為多個子分割區。這可以使用可選的 SUBPARTITION BY 子句來指示。子分割區可以使用 HASHKEY 來完成。兩者都可以是 LINEAR。這些工作方式與先前針對等效的分割區類型所描述的相同。(無法使用 LISTRANGE 進行子分割區。)

    子分割區的數量可以使用 SUBPARTITIONS 關鍵字後接一個整數值來指示。

  • 將嚴格檢查 PARTITIONSSUBPARTITIONS 子句中使用的值,並且此值必須遵守以下規則:

    • 該值必須為正的非零整數。

    • 不允許有前導零。

    • 該值必須為整數文字,而不能是運算式。例如,不允許 PARTITIONS 0.2E+01,即使 0.2E+01 的求值結果為 2。(錯誤 #15890)

  • partition_definition

    可以使用 partition_definition 子句來單獨定義每個分割區。組成此子句的各個部分如下:

    • PARTITION partition_name

      指定分割區的邏輯名稱。

    • VALUES

      對於範圍分割區,每個分割區必須包含 VALUES LESS THAN 子句;對於列表分割區,您必須為每個分割區指定 VALUES IN 子句。這用於判斷哪些列要儲存在此分割區中。有關語法範例,請參閱第 26 章,分割區中關於分割區類型的討論。

    • [STORAGE] ENGINE

      MySQL 接受 [STORAGE] ENGINE 選項用於 PARTITIONSUBPARTITION。目前,使用此選項的唯一方法是將所有分割區或所有子分割區設定為相同的儲存引擎,並且嘗試為同一表格中的分割區或子分割區設定不同的儲存引擎會引發錯誤 ERROR 1469 (HY000): 此版本的 MySQL 不允許分割區中的處理常式混合使用

    • 註解

      可以使用可選的 COMMENT 子句來指定描述分割區的字串。範例:

      COMMENT = 'Data for the years previous to 1999'

      分割區註解的最大長度為 1024 個字元。

    • DATA DIRECTORYINDEX DIRECTORY

      DATA DIRECTORYINDEX DIRECTORY 可用於指示分別要儲存此分割區的資料和索引的目錄。data_dirindex_dir 都必須是絕對系統路徑名稱。

      DATA DIRECTORY 子句中指定的目錄必須為 InnoDB 所知。如需更多資訊,請參閱使用 DATA DIRECTORY 子句

      您必須擁有 FILE 權限才能使用 DATA DIRECTORYINDEX DIRECTORY 分割區選項。

      範例

      CREATE TABLE th (id INT, name VARCHAR(30), adate DATE)
      PARTITION BY LIST(YEAR(adate))
      (
        PARTITION p1999 VALUES IN (1995, 1999, 2003)
          DATA DIRECTORY = '/var/appdata/95/data'
          INDEX DIRECTORY = '/var/appdata/95/idx',
        PARTITION p2000 VALUES IN (1996, 2000, 2004)
          DATA DIRECTORY = '/var/appdata/96/data'
          INDEX DIRECTORY = '/var/appdata/96/idx',
        PARTITION p2001 VALUES IN (1997, 2001, 2005)
          DATA DIRECTORY = '/var/appdata/97/data'
          INDEX DIRECTORY = '/var/appdata/97/idx',
        PARTITION p2002 VALUES IN (1998, 2002, 2006)
          DATA DIRECTORY = '/var/appdata/98/data'
          INDEX DIRECTORY = '/var/appdata/98/idx'
      );

      DATA DIRECTORYINDEX DIRECTORY 的行為方式與 CREATE TABLE 陳述式的 table_option 子句用於 MyISAM 表格時相同。

      每個分割區可以指定一個資料目錄和一個索引目錄。如果未指定,資料和索引預設會儲存在表格的資料庫目錄中。

      如果 NO_DIR_IN_CREATE 生效,則在建立分割表格時會忽略 DATA DIRECTORYINDEX DIRECTORY 選項。

    • MAX_ROWSMIN_ROWS

      可用於分別指定要儲存在分割區中的最大和最小列數。 max_number_of_rowsmin_number_of_rows 的值必須是正整數。與具有相同名稱的表格層級選項一樣,這些選項僅作為伺服器的建議,而不是硬性限制。

    • TABLESPACE

      可以藉由指定 TABLESPACE `innodb_file_per_table`,用來指定分割區的 InnoDB 單表表格空間。所有分割區必須屬於相同的儲存引擎。

      不支援將 InnoDB 表格分割區放置在共用的 InnoDB 表格空間中。共用的表格空間包括 InnoDB 系統表格空間和一般表格空間。

  • subpartition_definition

    分割區定義可以選擇包含一個或多個 subpartition_definition 子句。每個子句至少由 SUBPARTITION name 組成,其中 name 是子分割區的識別碼。除了將 PARTITION 關鍵字替換為 SUBPARTITION 之外,子分割區定義的語法與分割區定義的語法相同。

    子分割區必須透過 HASHKEY 來完成,並且只能在 RANGELIST 分割區上完成。請參閱第 26.2.6 節,「子分割區」

依產生欄位分割

允許依產生欄位分割。例如:

CREATE TABLE t1 (
  s1 INT,
  s2 INT AS (EXP(s1)) STORED
)
PARTITION BY LIST (s2) (
  PARTITION p1 VALUES IN (1)
);

分割將產生欄位視為一般欄位,這能夠針對不允許用於分割的函式限制提供解決方案(請參閱第 26.6.3 節,「分割區與函式相關的限制」)。前面的範例示範了此技術:EXP() 無法直接在 PARTITION BY 子句中使用,但允許使用以 EXP() 定義的產生欄位。