- 15.1.20.1 CREATE TABLE 建立的檔案
- 15.1.20.2 CREATE TEMPORARY TABLE 陳述式
- 15.1.20.3 CREATE TABLE ... LIKE 陳述式
- 15.1.20.4 CREATE TABLE ... SELECT 陳述式
- 15.1.20.5 FOREIGN KEY 限制
- 15.1.20.6 CHECK 限制
- 15.1.20.7 靜默欄位規格變更
- 15.1.20.8 CREATE TABLE 和產生的欄位
- 15.1.20.9 次要索引和產生的欄位
- 15.1.20.10 隱藏欄位
- 15.1.20.11 產生的隱藏主鍵
- 15.1.20.12 設定 NDB 註解選項
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 陳述式」。
表格複製與拷貝
LIKE
使用
CREATE TABLE ... LIKE
,根據另一個表格的定義建立一個空的表格,包括原始表格中定義的任何欄位屬性和索引。CREATE TABLE new_tbl LIKE orig_tbl;
如需更多資訊,請參閱第 15.1.20.3 節,「CREATE TABLE ... LIKE 陳述式」。
[AS]
query_expression
若要從另一個表格建立一個表格,請在
CREATE TABLE
陳述式末尾新增一個SELECT
陳述式。CREATE TABLE new_tbl AS SELECT * FROM orig_tbl;
如需更多資訊,請參閱第 15.1.20.4 節,「CREATE TABLE ... SELECT 陳述式」。
IGNORE | REPLACE
IGNORE
和REPLACE
選項指示在使用SELECT
陳述式複製表格時,如何處理重複唯一鍵值的列。如需更多資訊,請參閱第 15.1.20.4 節,「CREATE TABLE ... SELECT 陳述式」。
欄位資料類型與屬性
每個表格的欄位數硬性限制為 4096 個,但給定表格的有效最大值可能會較小,並且取決於第 10.4.7 節,「表格欄位計數和列大小的限制」中討論的因素。
data_type
data_type
表示欄位定義中的資料類型。如需完整描述指定欄位資料類型的語法,以及關於每個類型屬性的資訊,請參閱第 13 章,《資料類型》。AUTO_INCREMENT
僅適用於整數類型。字元資料類型(
CHAR
、VARCHAR
、TEXT
類型、ENUM
、SET
,以及任何同義詞)可以包含CHARACTER SET
以指定欄位的字元集。CHARSET
是CHARACTER SET
的同義詞。可以使用COLLATE
屬性指定字元集的校對,以及任何其他屬性。如需詳細資訊,請參閱第 12 章,《字元集、校對、Unicode》。範例:CREATE TABLE t (c CHAR(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin);
對於
CHAR
、VARCHAR
、BINARY
和VARBINARY
欄位,可以使用
語法來指定索引前綴長度,建立僅使用欄位值前導部分的索引。col_name
(length
)BLOB
和TEXT
欄位也可以被索引,但 必須 給定前綴長度。對於非二進位字串類型,前綴長度以字元為單位;對於二進位字串類型,前綴長度以位元組為單位。也就是說,索引項目由每個欄位值的前length
個字元組成,適用於CHAR
、VARCHAR
和TEXT
欄位;而索引項目由每個欄位值的前length
個位元組組成,適用於BINARY
、VARBINARY
和BLOB
欄位。僅對欄位值的前綴建立索引可以使索引檔案小得多。關於索引前綴的其他資訊,請參閱第 15.1.15 節,「CREATE INDEX 陳述式」。只有
InnoDB
和MyISAM
儲存引擎支援對BLOB
和TEXT
欄位建立索引。例如: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 8.4 中,只有
InnoDB
、MyISAM
和MEMORY
儲存引擎支援對可具有NULL
值的欄位建立索引。在其他情況下,您必須將索引欄位宣告為NOT NULL
,否則會產生錯誤。DEFAULT
指定欄位的預設值。如需關於預設值處理的更多資訊,包括欄位定義不包含明確
DEFAULT
值的情況,請參閱第 13.6 節,「資料類型預設值」。如果啟用
NO_ZERO_DATE
或NO_ZERO_IN_DATE
SQL 模式,並且根據該模式,日期值預設值不正確,則在未啟用嚴格 SQL 模式時,CREATE TABLE
會產生警告;若啟用嚴格模式,則會產生錯誤。例如,啟用NO_ZERO_IN_DATE
時,c1 DATE DEFAULT '2010-00-00'
會產生警告。VISIBLE
、INVISIBLE
指定欄位的可見性。如果未出現任何關鍵字,則預設值為
VISIBLE
。一個表格必須至少有一個可見欄位。嘗試使所有欄位都不可見會產生錯誤。如需更多資訊,請參閱第 15.1.20.10 節,「不可見欄位」。AUTO_INCREMENT
整數欄位可以具有額外的
AUTO_INCREMENT
屬性。當您將NULL
(建議)或0
的值插入索引的AUTO_INCREMENT
欄位時,該欄位會設定為下一個序列值。通常這是
,其中value
+1value
是表格中目前該欄位的最大值。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
欄位只有在包含正值時才能正常運作。插入負數會被視為插入一個非常大的正數。這樣做是為了避免數字從正數「環繞」到負數時出現精確度問題,並確保你不會意外得到一個包含0
的AUTO_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 節,「伺服器系統變數」。關於
InnoDB
和AUTO_INCREMENT
的資訊,請參閱第 17.6.1.6 節,「InnoDB 中的 AUTO_INCREMENT 處理」。關於AUTO_INCREMENT
和 MySQL 複寫的資訊,請參閱第 19.5.1.1 節,「複寫和 AUTO_INCREMENT」。註解
可以使用
COMMENT
選項為欄位指定註解,最多可達 1024 個字元。註解會由SHOW CREATE TABLE
和SHOW FULL COLUMNS
語法顯示。它也會顯示在 Information Schema 的COLUMNS
表格的COLUMN_COMMENT
欄位中。COLUMN_FORMAT
在 NDB Cluster 中,也可以使用
COLUMN_FORMAT
為NDB
資料表的個別欄位指定資料儲存格式。允許的欄位格式為FIXED
、DYNAMIC
和DEFAULT
。FIXED
用於指定固定寬度的儲存,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_ATTRIBUTE
和SECONDARY_ENGINE_ATTRIBUTE
選項用於指定主要和次要儲存引擎的欄位屬性。這些選項保留供未來使用。指定給此選項的值是一個字串常值,其中包含有效的 JSON 文件或空字串 ('')。無效的 JSON 會被拒絕。
CREATE TABLE t1 (c1 INT ENGINE_ATTRIBUTE='{"key":"value"}');
ENGINE_ATTRIBUTE
和SECONDARY_ENGINE_ATTRIBUTE
值可以重複指定而不會發生錯誤。在這種情況下,會使用最後指定的值。ENGINE_ATTRIBUTE
和SECONDARY_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 KEY
。PRIMARY 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 KEY
或UNIQUE NOT NULL
索引,則你可以在SELECT
語法中使用_rowid
來參照索引欄位,如唯一索引中所述。在 MySQL 中,
PRIMARY KEY
的名稱為PRIMARY
。對於其他索引,如果你未指定名稱,則會為索引指定與第一個索引欄位相同的名稱,並加上可選的尾碼 (_2
、_3
、...
) 以使其唯一。你可以使用SHOW INDEX FROM
來查看資料表的索引名稱。請參閱第 15.7.7.23 節,「SHOW INDEX 語法」。tbl_name
KEY | INDEX
KEY
通常是INDEX
的同義詞。當在欄位定義中給定時,索引鍵屬性PRIMARY KEY
也可以僅指定為KEY
。這是為了與其他資料庫系統相容而實作的。UNIQUE
UNIQUE
索引會建立約束,使索引中的所有值都必須是不同的。如果你嘗試新增索引鍵值與現有列相符的新列,則會發生錯誤。對於所有引擎,UNIQUE
索引允許可包含NULL
的欄位有多個NULL
值。如果你在UNIQUE
索引中為欄位指定前置值,則欄位值必須在前置長度內是唯一的。如果資料表具有由單一整數類型欄位組成的
PRIMARY KEY
或UNIQUE NOT NULL
索引,則你可以在SELECT
語法中使用_rowid
來參照索引欄位,如唯一索引中所述。FULLTEXT
FULLTEXT
索引是一種用於全文搜尋的特殊索引。只有InnoDB
和MyISAM
儲存引擎支援FULLTEXT
索引。它們只能從CHAR
、VARCHAR
和TEXT
資料行建立。索引總是在整個資料行上建立;不支援資料行前綴索引,且如果指定任何前綴長度都會被忽略。有關操作的詳細資訊,請參閱 第 14.9 節,「全文搜尋函數」。如果全文索引和搜尋操作需要特殊處理,則可以將WITH PARSER
子句指定為index_option
值,以將剖析器外掛程式與索引關聯。此子句僅對FULLTEXT
索引有效。InnoDB
和MyISAM
支援全文剖析器外掛程式。有關更多資訊,請參閱 全文剖析器外掛程式 和 撰寫全文剖析器外掛程式。SPATIAL
您可以在空間資料類型上建立
SPATIAL
索引。空間類型僅適用於InnoDB
和MyISAM
表格,且索引的資料行必須宣告為NOT NULL
。請參閱 第 13.4 節,「空間資料類型」。FOREIGN KEY
MySQL 支援外來鍵,可讓您跨表格交叉參照相關資料,以及外來鍵約束,這有助於保持此分散式資料的一致性。有關定義和選項資訊,請參閱
reference_definition
和reference_option
。使用
InnoDB
儲存引擎的分割表格不支援外來鍵。有關更多資訊,請參閱 第 26.6 節,「分割的限制與局限性」。CHECK
CHECK
子句可讓您建立對表格列中的資料值進行檢查的約束。請參閱 第 15.1.20.6 節,「CHECK 約束」。key_part
key_part
規格可以ASC
或DESC
結尾,以指定索引值是以遞增或遞減順序儲存。如果未提供順序指定符,則預設為遞增。對於使用
REDUNDANT
或COMPACT
列格式的InnoDB
表格,由length
屬性定義的前綴長度最多可為 767 個位元組。對於使用DYNAMIC
或COMPRESSED
列格式的InnoDB
表格,前綴長度限制為 3072 個位元組。對於MyISAM
表格,前綴長度限制為 1000 個位元組。前綴限制以位元組為單位來測量。但是,
CREATE TABLE
、ALTER TABLE
和CREATE INDEX
陳述式中索引規格的前綴長度,對於非二進位字串類型 (CHAR
、VARCHAR
、TEXT
) 解釋為字元數,而對於二進位字串類型 (BINARY
、VARBINARY
、BLOB
) 則解釋為位元組數。在為使用多位元組字元集的非二進位字串資料行指定前綴長度時,請考慮這一點。用於
key_part
規格的expr
可以採用(CAST
的形式,以在json_path
AStype
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
索引一起使用。如果全文索引和搜尋操作需要特殊處理,則它會將剖析器外掛程式與索引關聯。InnoDB
和MyISAM
支援全文剖析器外掛程式。如果您有一個與全文剖析器外掛程式相關聯的MyISAM
表格,您可以使用ALTER TABLE
將該表格轉換為InnoDB
。註解
索引定義可以包含最多 1024 個字元的選用註解。
您可以使用
index_option
COMMENT
子句為個別索引設定InnoDB
的MERGE_THRESHOLD
值。請參閱 第 17.8.11 節,「設定索引頁的合併閾值」。VISIBLE
、INVISIBLE
指定索引可見性。索引預設為可見。最佳化工具不會使用不可見的索引。索引可見性的規格適用於主要索引鍵 (明確或隱含) 以外的索引。有關更多資訊,請參閱 第 10.3.12 節,「不可見的索引」。
ENGINE_ATTRIBUTE
和SECONDARY_ENGINE_ATTRIBUTE
選項用於指定主要和次要儲存引擎的索引屬性。這些選項保留供將來使用。
有關允許的
index_option
值的更多資訊,請參閱 第 15.1.15 節,「CREATE INDEX 陳述式」。有關索引的更多資訊,請參閱 第 10.3.1 節,「MySQL 如何使用索引」。有關
reference_definition
語法詳細資訊和範例,請參閱 第 15.1.20.5 節,「FOREIGN KEY 約束」。InnoDB
和NDB
表格支援檢查外來鍵約束。被參考表格的資料行必須一律明確命名。支援對外來鍵的ON DELETE
和ON UPDATE
動作。有關更詳細的資訊和範例,請參閱 第 15.1.20.5 節,「FOREIGN KEY 約束」。對於其他儲存引擎,MySQL 伺服器會剖析並忽略
CREATE TABLE
陳述式中的FOREIGN KEY
語法。重要對於熟悉 ANSI/ISO SQL 標準的使用者,請注意,沒有任何儲存引擎 (包括
InnoDB
) 會識別或強制執行參考完整性約束定義中使用的MATCH
子句。使用明確的MATCH
子句不會產生指定的效果,並且也會導致ON DELETE
和ON UPDATE
子句被忽略。由於這些原因,應避免指定MATCH
。SQL 標準中的
MATCH
子句會控制在與主要索引鍵比較時,如何處理複合 (多資料行) 外來鍵中的NULL
值。InnoDB
本質上實作了MATCH SIMPLE
所定義的語義,它允許外來鍵全部或部分為NULL
。在這種情況下,允許插入包含此外來鍵的 (子表格) 列,並且不會比對到被參考 (父表格) 中的任何列。可以使用觸發程序來實作其他語義。此外,MySQL 要求被參考的資料行必須建立索引以提高效能。但是,
InnoDB
不會強制執行任何要求,要求被參考的資料行宣告為UNIQUE
或NOT NULL
。對於諸如UPDATE
或DELETE CASCADE
等操作,針對非唯一索引鍵或包含NULL
值的索引鍵的外來鍵參考的處理方式並未明確定義。建議您僅使用參考同時為UNIQUE
(或PRIMARY
) 和NOT NULL
的索引鍵的外來鍵。MySQL 會剖析但忽略「內嵌的
REFERENCES
規格」(如 SQL 標準中所定義),其中參考是定義為資料行規格的一部分。MySQL 僅在指定為單獨的FOREIGN KEY
規格的一部分時,才接受REFERENCES
子句。有關更多資訊,請參閱 第 1.7.2.3 節,「FOREIGN KEY 約束差異」。有關
RESTRICT
、CASCADE
、SET NULL
、NO ACTION
和SET 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 中,這適用於MyISAM
、MEMORY
、InnoDB
和ARCHIVE
表格。若要為不支援AUTO_INCREMENT
表格選項的引擎設定第一個自動遞增值,請在建立表格後插入一個值比所需值少一的「虛擬」列,然後刪除虛擬列。對於在
CREATE TABLE
陳述式中支援AUTO_INCREMENT
表格選項的引擎,您也可以使用ALTER TABLE
來重設tbl_name
AUTO_INCREMENT =N
AUTO_INCREMENT
值。該值不能設定為低於目前欄中的最大值。AVG_ROW_LENGTH
表格的平均列長度近似值。您只需要為具有可變大小列的大型表格設定此值。
當您建立
MyISAM
表格時,MySQL 會使用MAX_ROWS
和AVG_ROW_LENGTH
選項的乘積來決定產生的表格有多大。如果您沒有指定任何選項,則MyISAM
資料和索引檔案的最大大小預設為 256TB。(如果您的作業系統不支援如此大的檔案,則表格大小會受到檔案大小限制。)如果您想要縮小指標大小以使索引更小更快,並且您真的不需要大檔案,則可以透過設定myisam_data_pointer_size
系統變數來減小預設指標大小。(請參閱 第 7.1.8 節,“伺服器系統變數”。)如果您希望所有表格都能夠成長到超過預設限制,並且願意讓您的表格比必要時稍微慢一些且更大一些,則可以透過設定此變數來增加預設指標大小。將該值設定為 7 允許表格大小最大為 65,536TB。[DEFAULT] CHARACTER SET
指定表格的預設字元集。
CHARSET
是CHARACTER 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
選項NOLOGGING
、READ_BACKUP
、PARTITION_BALANCE
或FULLY_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 SchemaTABLES
表格的 TABLE_COMMENT 欄。此註解語法也支援用於
NDB
表格的ALTER TABLE
陳述式。請記住,用於ALTER TABLE
的表格註解會取代表格先前可能擁有的任何現有註解。在表格註解中設定
MERGE_THRESHOLD
選項不支援用於NDB
表格(它會被忽略)。如需完整的語法資訊和範例,請參閱 第 15.1.20.12 節,“設定 NDB 註解選項”。
COMPRESSION
用於
InnoDB
表格的頁面級壓縮的壓縮演算法。支援的值包括Zlib
、LZ4
和None
。COMPRESSION
屬性是隨著透明頁面壓縮功能引入的。頁面壓縮僅支援位於file-per-table 表空間中的InnoDB
表格,並且僅在支援稀疏檔案和挖洞的 Linux 和 Windows 平台上可用。如需更多資訊,請參閱 第 17.9.2 節,“InnoDB 頁面壓縮”。CONNECTION
FEDERATED
表格的連線字串。請注意舊版 MySQL 使用
COMMENT
選項來作為連線字串。DATA DIRECTORY
,INDEX DIRECTORY
對於
InnoDB
,DATA DIRECTORY='
子句允許在資料目錄之外建立表格。必須啟用directory
'innodb_file_per_table
變數才能使用DATA DIRECTORY
子句。必須指定完整的目錄路徑,並且InnoDB
必須知道此路徑。如需更多資訊,請參閱 第 17.6.1.2 節,“在外部建立表格”。建立
MyISAM
表格時,您可以使用DATA DIRECTORY='
子句、directory
'INDEX DIRECTORY='
子句或兩者。它們分別指定將directory
'MyISAM
表格的資料檔案和索引檔案放置在哪裡。與InnoDB
表格不同,MySQL 在使用DATA DIRECTORY
或INDEX DIRECTORY
選項建立MyISAM
表格時,不會建立與資料庫名稱對應的子目錄。檔案會建立在指定的目錄中。您必須具有
FILE
權限才能使用DATA DIRECTORY
或INDEX DIRECTORY
表格選項。重要對於分割表格,會忽略表格層級的
DATA DIRECTORY
和INDEX 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 DIRECTORY
或INDEX DIRECTORY
選項,並且找到現有的.MYD
或.MYI
檔案,MyISAM
一律會傳回錯誤,且不會覆寫指定目錄中的檔案。重要您無法將包含 MySQL 資料目錄的路徑名稱與
DATA DIRECTORY
或INDEX 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_ATTRIBUTE
和SECONDARY_ENGINE_ATTRIBUTE
選項是用於指定主要和次要儲存引擎的表格屬性。這些選項保留供未來使用。指派給這些選項的任何值都必須是包含有效 JSON 文件或空字串 ('') 的字串文字。無效的 JSON 會被拒絕。
CREATE TABLE t1 (c1 INT) ENGINE_ATTRIBUTE='{"key":"value"}';
ENGINE_ATTRIBUTE
和SECONDARY_ENGINE_ATTRIBUTE
值可以重複指定而不會發生錯誤。在這種情況下,會使用最後指定的值。ENGINE_ATTRIBUTE
和SECONDARY_ENGINE_ATTRIBUTE
值不會被伺服器檢查,也不會在資料表的儲存引擎變更時被清除。INSERT_METHOD
如果您想要將資料插入
MERGE
表格中,您必須使用INSERT_METHOD
指定應該將列插入其中的表格。INSERT_METHOD
是僅適用於MERGE
表格的選項。使用FIRST
或LAST
值,讓插入項目進入第一個或最後一個表格,或使用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_SIZE
,SHOW CREATE TABLE
也是如此。InnoDB
僅在表格層級支援KEY_BLOCK_SIZE
。使用 32KB 和 64KB
innodb_page_size
值時,不支援KEY_BLOCK_SIZE
。InnoDB
表格壓縮不支援這些頁面大小。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
會告知儲存引擎僅壓縮長的CHAR
、VARCHAR
、BINARY
或VARBINARY
資料行。如果您未使用
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
資料表,選項值可以是FIXED
或DYNAMIC
,分別表示靜態或可變長度的資料列格式。myisampack 將類型設定為COMPRESSED
。請參閱第 18.2.3 節,「MyISAM 資料表儲存格式」。對於
NDB
資料表,預設的ROW_FORMAT
為DYNAMIC
。START TRANSACTION
這是一個內部使用的資料表選項,用於在使用支援原子 DDL 的儲存引擎進行基於列複製時,允許將
CREATE TABLE ... SELECT
記錄為二進制日誌中的單個原子交易。在CREATE TABLE ... START TRANSACTION
之後,僅允許BINLOG
、COMMIT
和ROLLBACK
指令。有關相關資訊,請參閱第 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 TABLE
或ALTER 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 節,「通用資料表空間」。
是一個區分大小寫的識別符。它可以加上或不加上引號。不允許使用正斜線字元(“/”)。以 “innodb_” 開頭的名稱保留用於特殊用途。tablespace_name
若要在系統資料表空間中建立資料表,請指定
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_table
和TABLESPACE = innodb_temporary
子句與CREATE TEMPORARY TABLE
一起使用;預計會在未來版本的 MySQL 中移除。STORAGE
資料表選項僅適用於NDB
資料表。STORAGE
決定使用的儲存類型,可以是DISK
或MEMORY
。TABLESPACE ... STORAGE DISK
將資料表指派給 NDB Cluster 磁碟資料資料表空間。除非在CREATE TABLE
中前面有TABLESPACE
tablespace_name
,否則不能使用STORAGE DISK
。對於
STORAGE MEMORY
,資料表空間名稱是選用的,因此,您可以使用TABLESPACE
或直接使用tablespace_name
STORAGE MEMORYSTORAGE MEMORY
來明確指定資料表在記憶體中。請參閱第 25.6.11 節,〈NDB Cluster 磁碟資料表〉,以取得更多資訊。
用於將一組相同的
MyISAM
資料表當作一個來存取。這僅適用於MERGE
資料表。請參閱第 18.7 節,〈MERGE 儲存引擎〉。您必須對應到
MERGE
資料表的資料表擁有SELECT
、UPDATE
和DELETE
權限。請注意先前,所有使用的資料表都必須與
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 THAN
或VALUES 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 伺服器上使用的依KEY
或LINEAR KEY
分割的資料表。如需更多資訊,請參閱第 15.1.9.1 節,〈ALTER TABLE 分割區運算〉。mysqldump 會將此選項寫入版本化的註解中。
SHOW CREATE TABLE
的輸出中,會在必要時以版本化的註解顯示ALGORITHM=1
,方式與 mysqldump 相同。即使在建立原始資料表時指定了此選項,ALGORITHM=2
也會一律從SHOW CREATE TABLE
輸出中省略。您不得將
VALUES LESS THAN
或VALUES 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 < 10
或WHERE a = 1 AND b = 10 AND c < 10
等條件)。它可以讓您在COLUMNS
子句中使用欄位清單,並在每個PARTITION ... VALUES LESS THAN (
分割區定義子句中使用一組欄位值,來指定多個欄位中的值範圍。(在最簡單的情況下,此集合由單一欄位組成。)在value_list
)column_list
和value_list
中可參考的最大欄位數為 16 個。在
COLUMNS
子句中使用的column_list
只能包含欄位名稱;清單中的每個欄位都必須是以下 MySQL 資料類型之一:整數類型;字串類型;以及時間或日期欄位類型。不允許使用BLOB
、TEXT
、SET
、ENUM
、BIT
或空間資料類型;也不允許使用浮點數類型的欄位。您也不得在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 THAN
與PARTITION BY LIST
一起使用。請注意對於以
LIST
分割的表格,與VALUES IN
一起使用的值列表必須僅包含整數值。在 MySQL 8.4 中,您可以使用LIST COLUMNS
分割來克服此限制,這將在本節稍後描述。LIST COLUMNS(
column_list
)此
LIST
的變體有助於對使用多個欄位上的比較條件的查詢進行分割區修剪(亦即,具有諸如WHERE a = 5 AND b = 5
或WHERE 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 IN
與PARTITION 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
子句宣告的任何分割區的總數。請注意無論您在建立以
RANGE
或LIST
分割的表格時是否使用PARTITIONS
子句,您仍然必須在表格定義中包含至少一個PARTITION VALUES
子句(請參閱下文)。SUBPARTITION BY
可以選擇將分割區劃分為多個子分割區。這可以使用可選的
SUBPARTITION BY
子句來指示。子分割區可以使用HASH
或KEY
來完成。兩者都可以是LINEAR
。這些工作方式與先前針對等效的分割區類型所描述的相同。(無法使用LIST
或RANGE
進行子分割區。)子分割區的數量可以使用
SUBPARTITIONS
關鍵字後接一個整數值來指示。將嚴格檢查
PARTITIONS
或SUBPARTITIONS
子句中使用的值,並且此值必須遵守以下規則:該值必須為正的非零整數。
不允許有前導零。
該值必須為整數文字,而不能是運算式。例如,不允許
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
選項用於PARTITION
和SUBPARTITION
。目前,使用此選項的唯一方法是將所有分割區或所有子分割區設定為相同的儲存引擎,並且嘗試為同一表格中的分割區或子分割區設定不同的儲存引擎會引發錯誤 ERROR 1469 (HY000): 此版本的 MySQL 不允許分割區中的處理常式混合使用。註解
可以使用可選的
COMMENT
子句來指定描述分割區的字串。範例:COMMENT = 'Data for the years previous to 1999'
分割區註解的最大長度為 1024 個字元。
DATA DIRECTORY
和INDEX DIRECTORY
DATA DIRECTORY
和INDEX DIRECTORY
可用於指示分別要儲存此分割區的資料和索引的目錄。
和data_dir
都必須是絕對系統路徑名稱。index_dir
DATA DIRECTORY
子句中指定的目錄必須為InnoDB
所知。如需更多資訊,請參閱使用 DATA DIRECTORY 子句。您必須擁有
FILE
權限才能使用DATA DIRECTORY
或INDEX 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 DIRECTORY
和INDEX DIRECTORY
的行為方式與CREATE TABLE
陳述式的table_option
子句用於MyISAM
表格時相同。每個分割區可以指定一個資料目錄和一個索引目錄。如果未指定,資料和索引預設會儲存在表格的資料庫目錄中。
如果
NO_DIR_IN_CREATE
生效,則在建立分割表格時會忽略DATA DIRECTORY
和INDEX DIRECTORY
選項。MAX_ROWS
和MIN_ROWS
可用於分別指定要儲存在分割區中的最大和最小列數。
max_number_of_rows
和min_number_of_rows
的值必須是正整數。與具有相同名稱的表格層級選項一樣,這些選項僅作為伺服器的「建議」,而不是硬性限制。TABLESPACE
可以藉由指定
TABLESPACE `innodb_file_per_table`
,用來指定分割區的InnoDB
單表表格空間。所有分割區必須屬於相同的儲存引擎。不支援將
InnoDB
表格分割區放置在共用的InnoDB
表格空間中。共用的表格空間包括InnoDB
系統表格空間和一般表格空間。
subpartition_definition
分割區定義可以選擇包含一個或多個
subpartition_definition
子句。每個子句至少由SUBPARTITION
組成,其中name
name
是子分割區的識別碼。除了將PARTITION
關鍵字替換為SUBPARTITION
之外,子分割區定義的語法與分割區定義的語法相同。子分割區必須透過
HASH
或KEY
來完成,並且只能在RANGE
或LIST
分割區上完成。請參閱第 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()
定義的產生欄位。