- 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 | REPLACEIGNORE和REPLACE選項指示在使用SELECT陳述式複製表格時,如何處理重複唯一鍵值的列。如需更多資訊,請參閱第 15.1.20.4 節,「CREATE TABLE ... SELECT 陳述式」。
欄位資料類型與屬性
每個表格的欄位數硬性限制為 4096 個,但給定表格的有效最大值可能會較小,並且取決於第 10.4.7 節,「表格欄位計數和列大小的限制」中討論的因素。
data_typedata_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_DATESQL 模式,並且根據該模式,日期值預設值不正確,則在未啟用嚴格 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_ZEROSQL 模式,您可以在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 約束」。
CONSTRAINTsymbol可以給予
CONSTRAINT子句來命名約束。如果未給予子句,或在symbolCONSTRAINT關鍵字後未包含symbol,則 MySQL 會自動產生約束名稱,但以下註明的例外情況除外。如果使用symbol值,則該值在每個綱要 (資料庫) 和每個約束類型中都必須是唯一的。重複的symbol會導致錯誤。另請參閱第 11.2.1 節,「識別碼長度限制」中有關產生約束識別碼長度限制的討論。請注意如果在外部鍵定義中未給予
CONSTRAINT子句,或在symbolCONSTRAINT關鍵字後未包含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_nameKEY | INDEXKEY通常是INDEX的同義詞。當在欄位定義中給定時,索引鍵屬性PRIMARY KEY也可以僅指定為KEY。這是為了與其他資料庫系統相容而實作的。UNIQUEUNIQUE索引會建立約束,使索引中的所有值都必須是不同的。如果你嘗試新增索引鍵值與現有列相符的新列,則會發生錯誤。對於所有引擎,UNIQUE索引允許可包含NULL的欄位有多個NULL值。如果你在UNIQUE索引中為欄位指定前置值,則欄位值必須在前置長度內是唯一的。如果資料表具有由單一整數類型欄位組成的
PRIMARY KEY或UNIQUE NOT NULL索引,則你可以在SELECT語法中使用_rowid來參照索引欄位,如唯一索引中所述。FULLTEXTFULLTEXT索引是一種用於全文搜尋的特殊索引。只有InnoDB和MyISAM儲存引擎支援FULLTEXT索引。它們只能從CHAR、VARCHAR和TEXT資料行建立。索引總是在整個資料行上建立;不支援資料行前綴索引,且如果指定任何前綴長度都會被忽略。有關操作的詳細資訊,請參閱 第 14.9 節,「全文搜尋函數」。如果全文索引和搜尋操作需要特殊處理,則可以將WITH PARSER子句指定為index_option值,以將剖析器外掛程式與索引關聯。此子句僅對FULLTEXT索引有效。InnoDB和MyISAM支援全文剖析器外掛程式。有關更多資訊,請參閱 全文剖析器外掛程式 和 撰寫全文剖析器外掛程式。SPATIAL您可以在空間資料類型上建立
SPATIAL索引。空間類型僅適用於InnoDB和MyISAM表格,且索引的資料行必須宣告為NOT NULL。請參閱 第 13.4 節,「空間資料類型」。FOREIGN KEYMySQL 支援外來鍵,可讓您跨表格交叉參照相關資料,以及外來鍵約束,這有助於保持此分散式資料的一致性。有關定義和選項資訊,請參閱
reference_definition和reference_option。使用
InnoDB儲存引擎的分割表格不支援外來鍵。有關更多資訊,請參閱 第 26.6 節,「分割的限制與局限性」。CHECKCHECK子句可讓您建立對表格列中的資料值進行檢查的約束。請參閱 第 15.1.20.6 節,「CHECK 約束」。key_partkey_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_pathAStypeARRAY)JSON資料行上建立多值索引。多值索引,提供了關於多值索引的建立、使用以及限制的詳細資訊。
index_type某些儲存引擎允許您在建立索引時指定索引類型。
index_type指定符的語法為USING。type_name範例
CREATE TABLE lookup (id INT, INDEX USING BTREE (id) ) ENGINE = MEMORY;USING的慣用位置是在索引資料行清單之後。它可以在資料行清單之前給出,但支援在該位置使用選項已不建議使用,您應該預期它會在未來的 MySQL 版本中移除。index_optionindex_option值指定索引的其他選項。KEY_BLOCK_SIZE對於
MyISAM表格,KEY_BLOCK_SIZE可以選擇指定用於索引鍵區塊的大小 (以位元組為單位)。該值被視為提示;如有必要,可以使用不同的大小。為個別索引定義指定的KEY_BLOCK_SIZE值會覆寫表格層級的KEY_BLOCK_SIZE值。有關表格層級
KEY_BLOCK_SIZE屬性的資訊,請參閱表格選項。WITH PARSERWITH PARSER選項只能與FULLTEXT索引一起使用。如果全文索引和搜尋操作需要特殊處理,則它會將剖析器外掛程式與索引關聯。InnoDB和MyISAM支援全文剖析器外掛程式。如果您有一個與全文剖析器外掛程式相關聯的MyISAM表格,您可以使用ALTER TABLE將該表格轉換為InnoDB。註解索引定義可以包含最多 1024 個字元的選用註解。
您可以使用
index_optionCOMMENT子句為個別索引設定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_nameAUTO_INCREMENT =NAUTO_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_optionCOMMENT子句為表格設定InnoDBMERGE_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 頁面壓縮”。CONNECTIONFEDERATED表格的連線字串。請注意舊版 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。)ENCRYPTIONENCRYPTION子句可為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 *,其中rowsrows是您預期插入表格中的列數。最大
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 節,「設定持續性最佳化工具統計資訊參數」。TABLESPACETABLESPACE子句可用於在現有的通用資料表空間、單一資料表資料表空間或系統資料表空間中建立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中前面有TABLESPACEtablespace_name,否則不能使用STORAGE DISK。對於
STORAGE MEMORY,資料表空間名稱是選用的,因此,您可以使用TABLESPACE或直接使用tablespace_nameSTORAGE 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) ) );PARTITIONSnum可以選擇使用
PARTITIONS子句指定分割區的數量,其中numnum是分割區的數量。如果同時使用此子句和任何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子句來單獨定義每個分割區。組成此子句的各個部分如下:PARTITIONpartition_name指定分割區的邏輯名稱。
VALUES對於範圍分割區,每個分割區必須包含
VALUES LESS THAN子句;對於列表分割區,您必須為每個分割區指定VALUES IN子句。這用於判斷哪些列要儲存在此分割區中。有關語法範例,請參閱第 26 章,分割區中關於分割區類型的討論。[STORAGE] ENGINEMySQL 接受
[STORAGE] ENGINE選項用於PARTITION和SUBPARTITION。目前,使用此選項的唯一方法是將所有分割區或所有子分割區設定為相同的儲存引擎,並且嘗試為同一表格中的分割區或子分割區設定不同的儲存引擎會引發錯誤 ERROR 1469 (HY000): 此版本的 MySQL 不允許分割區中的處理常式混合使用。註解可以使用可選的
COMMENT子句來指定描述分割區的字串。範例:COMMENT = 'Data for the years previous to 1999'分割區註解的最大長度為 1024 個字元。
DATA DIRECTORY和INDEX DIRECTORYDATA DIRECTORY和INDEX DIRECTORY可用於指示分別要儲存此分割區的資料和索引的目錄。和data_dir都必須是絕對系統路徑名稱。index_dirDATA 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組成,其中namename是子分割區的識別碼。除了將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() 定義的產生欄位。