- 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
欄位也可以建立索引,但必須給定前置詞長度。非二進位字串類型的前置詞長度以字元為單位,而二進位字串類型則以位元組為單位。也就是說,對於CHAR
、VARCHAR
和TEXT
欄位,索引項目包含每個欄位值的前length
個字元;對於BINARY
、VARBINARY
和BLOB
欄位,索引項目包含每個欄位值的前length
個位元組。僅對欄位值的前置詞建立索引可以使索引檔案小得多。有關索引前置詞的其他資訊,請參閱 第 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 9.0 中,只有
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 模式,您可以將0
儲存在AUTO_INCREMENT
欄位中,而不會產生新的序列值。請參閱第 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
陳述式顯示。它也會顯示在資訊綱要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 9.0 會靜默忽略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
符號
可以給定
CONSTRAINT
子句來為限制命名。如果未給定子句,或在符號
CONSTRAINT
關鍵字之後未包含符號
,MySQL 會自動產生限制名稱,但以下情況除外。如果使用符號
值,則該值在每個綱要(資料庫)中,針對每個限制類型都必須是唯一的。重複的符號
會導致錯誤。另請參閱關於第 11.2.1 節,「識別碼長度限制」中產生的限制識別碼的長度限制的討論。注意如果在外來鍵定義中未給定
CONSTRAINT
子句,或在符號
CONSTRAINT
關鍵字之後未包含符號
,MySQL 會自動產生限制名稱。SQL 標準規定所有類型的限制(主鍵、唯一索引、外來鍵、檢查)都屬於同一命名空間。在 MySQL 中,每種限制類型在每個綱要中都有自己的命名空間。因此,每種限制類型的名稱在每個綱要中都必須是唯一的,但不同類型的限制可以具有相同的名稱。
PRIMARY KEY
一個唯一索引,其中所有鍵欄位都必須定義為
NOT NULL
。如果它們沒有明確宣告為NOT NULL
,MySQL 會隱含地(且靜默地)將它們宣告為NOT NULL
。一個資料表只能有一個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
索引,您可以使用_rowid
在SELECT
陳述式中參照索引欄位,如唯一索引中所述。在 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
索引,您可以使用_rowid
在SELECT
陳述式中參照索引欄位,如唯一索引中所述。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
結尾,以指定索引值是否依遞增或遞減順序儲存。如果未給定順序指定符,則預設為遞增。由
length
屬性定義的前綴,對於使用REDUNDANT
或COMPACT
資料列格式的InnoDB
表格而言,最長可達 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 節,「外鍵約束」。對於其他儲存引擎,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 也接受隱式參考至父資料表的主鍵。更多資訊,請參閱第 15.1.20.5 節,「外鍵約束」,以及第 1.7.2.3 節,「外鍵約束差異」。關於
RESTRICT
、CASCADE
、SET NULL
、NO ACTION
和SET 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 中,這適用於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
一起使用的資料表註解會取代該資料表先前可能有的任何現有註解。不支援在
NDB
資料表的資料表註解中設定MERGE_THRESHOLD
選項(它會被忽略)。如需完整的語法資訊和範例,請參閱第 15.1.20.12 節,「設定 NDB 註解選項」。
COMPRESSION
用於
InnoDB
資料表頁面層級壓縮的壓縮演算法。支援的值包括Zlib
、LZ4
和None
。COMPRESSION
屬性是隨著透明頁面壓縮功能引入的。頁面壓縮僅支援位於每個資料表獨立檔案表空間中的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
資料表不同,當使用DATA DIRECTORY
或INDEX DIRECTORY
選項建立MyISAM
資料表時,MySQL 不會建立與資料庫名稱相對應的子目錄。檔案會建立在指定的目錄中。您必須具有
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
總是會傳回錯誤,並且不會覆寫指定目錄中的檔案。重要您不能在
DATA DIRECTORY
或INDEX 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_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
組態選項決定。1
值會使統計資料在表格中 10% 的資料發生變更時重新計算。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 磁碟資料表空間。STORAGE DISK
無法在CREATE TABLE
中使用,除非前面加上TABLESPACE
tablespace_name
。對於
STORAGE MEMORY
,表空間名稱是選擇性的,因此,您可以使用TABLESPACE
或直接使用tablespace_name
STORAGE MEMORYSTORAGE MEMORY
來明確指定資料表位於記憶體中。如需詳細資訊,請參閱第 25.6.11 節,〈NDB Cluster 磁碟資料表〉。
用於存取一組相同的
MyISAM
資料表 (如同一個資料表)。這僅適用於MERGE
資料表。請參閱第 18.7 節,〈MERGE 儲存引擎〉。您必須具有
SELECT
、UPDATE
和DELETE
權限,才能對應到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 THAN
或VALUES 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 或更新的伺服器上建立依KEY
或LINEAR KEY
分割的資料表,這些資料表可以在 MySQL 5.1 伺服器上使用。如需詳細資訊,請參閱第 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 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 < 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
子句中更多的數值會導致語句失敗並顯示錯誤訊息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 THAN
與PARTITION BY LIST
一起使用。注意對於使用
LIST
分割的資料表,與VALUES IN
一起使用的值列表必須僅包含整數值。在 MySQL 9.0 中,您可以使用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
。使用
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
子句宣告的任何分割區的總數。注意無論您是否在使用
RANGE
或LIST
分割的資料表中使用了PARTITIONS
子句,您仍然必須在資料表定義中包含至少一個PARTITION VALUES
子句(請參閱下文)。SUBPARTITION BY
分割區可以選擇性地劃分為多個子分割區。可以使用選擇性的
SUBPARTITION BY
子句來指示這一點。子分割區可以透過HASH
或KEY
來完成。這些中的任何一個都可以是LINEAR
。它們的工作方式與前面描述的等效分割區類型相同。(無法使用LIST
或RANGE
進行子分割區。)可以使用
SUBPARTITIONS
關鍵字後接一個整數值來指示子分割區的數量。對
PARTITIONS
或SUBPARTITIONS
子句中使用的值進行嚴格檢查,並且此值必須遵守以下規則該值必須為正數、非零整數。
不允許使用前導零。
該值必須為整數文字,並且不能是表達式。例如,即使
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
選項,適用於PARTITION
和SUBPARTITION
。目前,這個選項唯一的使用方式是將所有分割區或所有子分割區設定為相同的儲存引擎。若嘗試在同一個表格中為不同的分割區或子分割區設定不同的儲存引擎,則會引發錯誤訊息 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 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
是子分割區的識別符。除了用SUBPARTITION
關鍵字替換PARTITION
關鍵字之外,子分割區定義的語法與分割區定義的語法相同。子分割必須使用
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()
定義的產生欄位。