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


MySQL 9.0 參考手冊  /  ...  /  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 9.0 以字元解釋字元欄位定義中的長度規範。BINARYVARBINARY 的長度以位元組為單位。

    • 對於 CHARVARCHARBINARYVARBINARY 欄位,可以使用 col_name(length) 語法指定索引前置詞長度,來建立僅使用欄位值開頭部分的索引。BLOBTEXT 欄位也可以建立索引,但必須給定前置詞長度。非二進位字串類型的前置詞長度以字元為單位,而二進位字串類型則以位元組為單位。也就是說,對於 CHARVARCHARTEXT 欄位,索引項目包含每個欄位值的前 length 個字元;對於 BINARYVARBINARYBLOB 欄位,索引項目包含每個欄位值的前 length 個位元組。僅對欄位值的前置詞建立索引可以使索引檔案小得多。有關索引前置詞的其他資訊,請參閱 第 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

    如果未指定 NULL 也未指定 NOT NULL,則欄位會被視為已指定 NULL

    在 MySQL 9.0 中,只有 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 模式,您可以將 0 儲存在 AUTO_INCREMENT 欄位中,而不會產生新的序列值。請參閱第 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 陳述式顯示。它也會顯示在資訊綱要 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 9.0 會靜默忽略 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 符號

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

    注意

    如果在外來鍵定義中未給定 CONSTRAINT 符號 子句,或在 CONSTRAINT 關鍵字之後未包含 符號,MySQL 會自動產生限制名稱。

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

  • PRIMARY KEY

    一個唯一索引,其中所有鍵欄位都必須定義為 NOT NULL。如果它們沒有明確宣告為 NOT NULL,MySQL 會隱含地(且靜默地)將它們宣告為 NOT NULL。一個資料表只能有一個 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 索引,您可以使用 _rowidSELECT 陳述式中參照索引欄位,如唯一索引中所述。

    在 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 索引,您可以使用 _rowidSELECT 陳述式中參照索引欄位,如唯一索引中所述。

  • 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 結尾,以指定索引值是否依遞增或遞減順序儲存。如果未給定順序指定符,則預設為遞增。

    • length 屬性定義的前綴,對於使用 REDUNDANTCOMPACT 資料列格式的 InnoDB 表格而言,最長可達 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 子句,為個別索引設定 InnoDB MERGE_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 節,「外鍵約束」

    對於其他儲存引擎,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 也接受隱式參考至父資料表的主鍵。更多資訊,請參閱第 15.1.20.5 節,「外鍵約束」,以及第 1.7.2.3 節,「外鍵約束差異」

  • reference_option

    關於 RESTRICTCASCADESET NULLNO ACTIONSET DEFAULT 選項的資訊,請參閱第 15.1.20.5 節,「外鍵約束」

資料表選項

資料表選項用於最佳化資料表的行為。在大多數情況下,您不必指定任何選項。除非另有說明,否則這些選項適用於所有儲存引擎。不適用於特定儲存引擎的選項可能會被接受並記住為資料表定義的一部分。如果您之後使用 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 9.0》

    預設情況下,如果指定的儲存引擎不可用,則陳述式會失敗並出現錯誤。您可以藉由從伺服器 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 9.0 中,這適用於 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 一起使用的資料表註解會取代該資料表先前可能有的任何現有註解。

    不支援在 NDB 資料表的資料表註解中設定 MERGE_THRESHOLD 選項(它會被忽略)。

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

  • COMPRESSION

    用於 InnoDB 資料表頁面層級壓縮的壓縮演算法。支援的值包括 ZlibLZ4NoneCOMPRESSION 屬性是隨著透明頁面壓縮功能引入的。頁面壓縮僅支援位於每個資料表獨立檔案表空間中的 InnoDB 資料表,並且僅在支援稀疏檔案和空洞處理的 Linux 和 Windows 平台上可用。如需更多資訊,請參閱第 17.9.2 節,「InnoDB 頁面壓縮」

  • CONNECTION

    FEDERATED 資料表的連線字串。

    注意

    舊版本的 MySQL 使用 COMMENT 選項來設定連線字串。

  • DATA DIRECTORY, INDEX DIRECTORY

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

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

    您必須具有 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 總是會傳回錯誤,並且不會覆寫指定目錄中的檔案。

    重要

    您不能在 DATA DIRECTORYINDEX DIRECTORY 中使用包含 MySQL 資料目錄的路徑名稱。這包括分割區資料表和個別的資料表分割區。(請參閱錯誤 #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 STATUSCreate_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_ROWS 控制 NDB 表格的分割區數已被棄用。為了向後相容,它在較新版本中仍然被支援,但可能會在未來的版本中移除。請改用 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=FIXED,則 InnoDB 會發出警告並假設 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 組態選項決定。1 值會使統計資料在表格中 10% 的資料發生變更時重新計算。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 磁碟資料表空間。STORAGE DISK 無法在 CREATE TABLE 中使用,除非前面加上 TABLESPACE tablespace_name

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

    如需詳細資訊,請參閱第 25.6.11 節,〈NDB Cluster 磁碟資料表〉

  • UNION

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

    您必須具有 SELECTUPDATEDELETE 權限,才能對應到 MERGE 資料表的資料表。

    注意

    先前,所有使用的資料表都必須與 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 節,〈LINEAR 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 節,〈LINEAR HASH 分割〉第 26.2.5 節,〈KEY 分割〉)。此範例使用依索引鍵的線性分割來在 5 個分割之間分配資料

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

    ALGORITHM={1 | 2} 選項支援搭配 [SUB]PARTITION BY [LINEAR] KEY 使用。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 或更新的伺服器上建立依 KEYLINEAR KEY 分割的資料表,這些資料表可以在 MySQL 5.1 伺服器上使用。如需詳細資訊,請參閱第 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 9.0 中,您可以使用 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 區塊(在 C、Java 和 PHP 等許多程式語言中找到)的 case 部分相似。也就是說,子句的排列方式必須使每個連續的 VALUES LESS THAN 中指定的上限大於前一個,而引用 MAXVALUE 的子句必須在列表中的最後一個。

  • RANGE COLUMNS(column_list)

    這個 RANGE 的變體有助於針對多個欄位上使用範圍條件的查詢進行分割區修剪 (partition pruning) (也就是說,具有諸如 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 子句中更多的數值會導致語句失敗並顯示錯誤訊息Inconsistency in usage of column lists for partitioning...。您不能將 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 節「RANGE 分割」第 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 9.0 中,您可以使用 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

    使用 PARTITION BY LIST COLUMNS 時,用於 VALUES IN 的數值列表與使用 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 子句中使用的值進行嚴格檢查,並且此值必須遵守以下規則

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

    • 不允許使用前導零。

    • 該值必須為整數文字,並且不能是表達式。例如,即使 0.2E+01 計算結果為 2,也不允許使用 PARTITIONS 0.2E+01。(錯誤 #15890)

  • partition_definition

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

    • PARTITION partition_name

      指定分割區的邏輯名稱。

    • VALUES

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

    • [STORAGE] ENGINE

      MySQL 接受 [STORAGE] ENGINE 選項,適用於 PARTITIONSUBPARTITION。目前,這個選項唯一的使用方式是將所有分割區或所有子分割區設定為相同的儲存引擎。若嘗試在同一個表格中為不同的分割區或子分割區設定不同的儲存引擎,則會引發錯誤訊息 ERROR 1469 (HY000): The mix of handlers in the partitions is not permitted in this version of 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 是子分割區的識別符。除了用 SUBPARTITION 關鍵字替換 PARTITION 關鍵字之外,子分割區定義的語法與分割區定義的語法相同。

    子分割必須使用 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() 定義的產生欄位。