### 13.1.20 CREATE TABLE 语句

[13.1.20.1 CREATE TABLE 创建的文件](create-table-files.html)
[13.1.20.2 CREATE TEMPORARY TABLE 语句](create-temporary-table.html)
[13.1.20.3 CREATE TABLE ... LIKE 语句](create-table-like.html)
[13.1.20.4 CREATE TABLE ... SELECT 语句](create-table-select.html)
[13.1.20.5 外键约束](create-table-foreign-keys.html)
[13.1.20.6 检查约束](create-table-check-constraints.html)
[13.1.20.7 静音列规格更改](silent-column-changes.html)
[13.1.20.8 创建表和生成的列](create-table-generated-columns.html)
[13.1.20.9 二级索引和生成的列](create-table-secondary-indexes.html)
[13.1.20.10 不可见列](invisible-columns.html)
[13.1.20.11 设置 NDB 注释选项](create-table-ndb-comment-options.html)

[](<>)

```
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 11, 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}
  | SECONDARY_ENGINE_ATTRIBUTE [=] 'string'
  | STATS_AUTO_RECALC [=] {DEFAULT | 0 | 1}
  | STATS_PERSISTENT [=] {DEFAULT | 0 | 1}
  | STATS_SAMPLE_PAGES [=] value
  | TABLESPACE tablespace_name [STORAGE {DISK | MEMORY}]
  | 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]

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

[`创建表`](create-table.html)创建一个具有给定名称的表。你必须拥有[`创建`](privileges-provided.html#priv_create)表的特权。

默认情况下，表是在默认数据库中创建的，使用[`InnoDB`](innodb-storage-engine.html)存储引擎。如果表存在、没有默认数据库或数据库不存在，则会发生错误。

[](<>)[](<>)

MySQL 对表的数量没有限制。底层文件系统可能对代表表的文件数量有限制。单独的存储引擎可能会施加特定于引擎的约束。`InnoDB`允许多达 40 亿张表。

有关表的物理表示的信息，请参阅[第 13.1.20.1 节，“由 CREATE TABLE 创建的文件”](create-table-files.html).

有几个方面的[`创建表`](create-table.html)声明，在本节的以下主题下进行描述：

-   [表名](create-table.html#create-table-name)

-   [临时表](create-table.html#create-table-temporary-tables)

-   [表克隆和复制](create-table.html#create-table-clone-copy)

-   [列数据类型和属性](create-table.html#create-table-types-attributes)

-   [索引、外键和 CHECK 约束](create-table.html#create-table-indexes-keys)

-   [表选项](create-table.html#create-table-options)

-   [表分区](create-table.html#create-table-partitioning)

#### 表名

-   `*`tbl_name`*`

    表名可以指定为*`db_name.tbl_name`*在特定数据库中创建表。无论是否存在默认数据库，这都有效，假设数据库存在。如果您使用带引号的标识符，请分别引用数据库和表名。例如，写``mydb`.`mytbl``， 不是`mydb.mytbl`.

    允许的表名的规则在[第 9.2 节，“架构对象名称”](identifiers.html).

-   `如果不存在`

    如果表存在，则防止发生错误。但是，无法验证现有表的结构与[`创建表`](create-table.html)陈述。

#### 临时表

您可以使用`暂时的`创建表时的关键字。一种`暂时的`table 仅在当前会话中可见，并在会话关闭时自动删除。有关详细信息，请参阅[第 13.1.20.2 节，“CREATE TEMPORARY TABLE 语句”](create-temporary-table.html).

#### 表克隆和复制

-   `喜欢`

    使用`创建表格。。。喜欢`要基于另一个表的定义（包括原始表中定义的任何列属性和索引）创建空表，请执行以下操作：

    ```
    CREATE TABLE new_tbl LIKE orig_tbl;
    ```

    有关更多信息，请参阅[第13.1.20.3节，“创建类似表的语句”](create-table-like.html).

-   `[作为]*`查询表达式`*`

    要从一个表创建另一个表，请添加[`选择`](select.html)报告结尾的声明[`创建表格`](create-table.html)声明：

    ```
    CREATE TABLE new_tbl AS SELECT * FROM orig_tbl;
    ```

    有关更多信息，请参阅[第13.1.20.4节，“创建表…选择语句”](create-table-select.html).

-   `忽略|替换`

    这个`忽视`和`代替`选项指示在使用[`选择`](select.html)陈述

    有关更多信息，请参阅[第13.1.20.4节，“创建表…选择语句”](create-table-select.html).

#### 列数据类型和属性

每个表有4096列的硬限制，但对于给定的表，有效最大值可能更小，这取决于中讨论的因素[第8.4.7节，“表列计数和行大小的限制”](column-count-limit.html).

-   `*`数据类型`*`

    *`数据类型`*表示列定义中的数据类型。有关可用于指定列数据类型的语法的完整描述，以及有关每种类型的属性的信息，请参阅[第11章，*数据类型*](data-types.html).

    -   有些属性并不适用于所有数据类型。`自动增量`仅适用于整数和浮点类型。在MySQL 8.0.13之前，`违约`不适用于[`斑点`](blob.html), [`文本`](blob.html), `几何学`和[`JSON`](json.html)类型。

    -   字符数据类型([`烧焦`](char.html), [`瓦尔查尔`](char.html)这个[`文本`](blob.html)类型，[`枚举`](enum.html), [`设置`](set.html)，以及任何同义词）可以包括`字符集`指定列的字符集。`CHARSET`是的同义词`字符集`。可以使用指定字符集的排序规则`整理`属性，以及任何其他属性。有关详细信息，请参阅[第十章，*字符集、排序规则、Unicode*](charset.html).例如：

        ```
        CREATE TABLE t (c CHAR(20) CHARACTER SET utf8 COLLATE utf8_bin);
        ```

        MySQL 8.0以字符为单位解释字符列定义中的长度规范。长度[`二进制的`](binary-varbinary.html)和[`VARBINARY`](binary-varbinary.html)以字节为单位。

    -   对于[`烧焦`](char.html), [`瓦尔查尔`](char.html), [`二进制的`](binary-varbinary.html)和[`VARBINARY`](binary-varbinary.html)在列中，可以使用`*`上校的名字`*(*`长`*)`指定索引前缀长度的语法。[`斑点`](blob.html)和[`文本`](blob.html)列也可以被索引，但前缀长度*必须*被给予。非二进制字符串类型的前缀长度以字符为单位，二进制字符串类型的前缀长度以字节为单位。也就是说，索引项由第一个*`长`*每个列值的字符数[`烧焦`](char.html), [`瓦尔查尔`](char.html)和[`文本`](blob.html)列和第一列*`长`*的每个列值的字节数[`二进制的`](binary-varbinary.html), [`VARBINARY`](binary-varbinary.html)和[`斑点`](blob.html)柱。仅对这样的列值的前缀进行索引可以使索引文件小得多。有关索引前缀的更多信息，请参阅[第13.1.15节，“创建索引语句”](create-index.html).

        [](<>)[](<>)[](<>)[](<>)

        只有`InnoDB`和`米萨姆`存储引擎支持在[`斑点`](blob.html)和[`文本`](blob.html)柱。例如：

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

        如果指定的索引前缀超过最大列数据类型大小，[`创建表格`](create-table.html)按如下方式处理索引：

        -   对于非唯一索引，要么发生错误（如果启用了严格SQL模式），要么将索引长度减少到最大列数据类型大小范围内，并生成警告（如果未启用严格SQL模式）。

        -   对于唯一索引，无论SQL模式如何，都会发生错误，因为减少索引长度可能会导致插入不符合指定唯一性要求的非唯一项。

    -   [`JSON`](json.html)无法为列编制索引。可以通过在生成的列上创建一个索引来解决这个限制，该索引从`JSON`柱看见[索引生成的列以提供JSON列索引](create-table-secondary-indexes.html#json-column-indirect-index)，以获取详细示例。

-   `非空|空`

    [](<>)[](<>)

    如果两者都不是`无效的`也没有`非空`如果指定，则列将被视为`无效的`已被指定。

    在MySQL 8.0中，只有`InnoDB`, `米萨姆`和`记忆力`存储引擎支持列上的索引，这些列可以`无效的`价值观在其他情况下，必须将索引列声明为`非空`或者一个错误的结果。

-   `违约`

    [](<>)[](<>)

    指定列的默认值。有关默认值处理的详细信息，包括列定义不包含显式`违约`价值观，见[第11.6节，“数据类型默认值”](data-type-defaults.html).

    如果[`没有约会`](sql-mode.html#sqlmode_no_zero_date)或[`没有零年的约会`](sql-mode.html#sqlmode_no_zero_in_date)SQL模式已启用，根据该模式，日期值默认值不正确，[`创建表格`](create-table.html)如果未启用严格SQL模式，则生成警告；如果启用严格模式，则生成错误。例如[`没有零年的约会`](sql-mode.html#sqlmode_no_zero_in_date)启用，`c1日期默认值“2010-00-00”`产生一个警告。

-   `看得见的`, `看不见的`

    指定列可见性。默认值是`看得见的`如果两个关键字都不存在。表必须至少有一个可见列。试图使所有列不可见会产生错误。有关更多信息，请参阅[第13.1.20.10节，“隐形柱”](invisible-columns.html).

    [](<>)

    这个`看得见的`和`看不见的`从MySQL 8.0.23开始提供关键字。在MySQL 8.0.23之前，所有列都是可见的。

-   `自动增量`

    整数或浮点列可以具有附加属性`自动增量`.当您插入值`无效的`（推荐）或`0`变成索引`自动增量`列，则该列被设置为下一个序列值。通常这是`*`价值`*+1`哪里*`价值`*是表中当前列的最大值。`自动增量`序列以`1.`.

    取回`自动增量`值插入行后，使用[`最后插入ID（）`](information-functions.html#function_last-insert-id)SQL函数或[`mysql_insert_id（）`](https://dev.mysql.com/doc/c-api/8.0/en/mysql-insert-id.html)C API函数。看见[第12.16节“信息功能”](information-functions.html)和[mysql\_插入\_id（）](https://dev.mysql.com/doc/c-api/8.0/en/mysql-insert-id.html).

    如果[`零上无自动值`](sql-mode.html#sqlmode_no_auto_value_on_zero)如果启用SQL模式，则可以存储`0`在里面`自动增量`列作为`0`不生成新的序列值。看见[第5.1.11节，“服务器SQL模式”](sql-mode.html).

    只能有一个`自动增量`对于每个表的列，它必须被索引，并且不能有`违约`价值一`自动增量`列只有在只包含正值时才能正常工作。插入一个负数被认为是插入一个非常大的正数。这样做是为了避免当数字从正数“换行”到负数时出现精度问题，同时也确保不会意外地得到错误的结果`自动增量`包含`0`.

    对于`米萨姆`表中，可以指定`自动增量`多列键中的第二列。看见[第3.6.9节，“使用自动\_增量“](example-auto-increment.html).

    [](<>)[](<>)

    要使MySQL与一些ODBC应用程序兼容，可以找到`自动增量`具有以下查询的最后一个插入行的值：

    ```
    SELECT * FROM tbl_name WHERE auto_col IS NULL
    ```

    这种方法要求[`sql_auto_为空`](server-system-variables.html#sysvar_sql_auto_is_null)变量未设置为0。看见[第5.1.8节“服务器系统变量”](server-system-variables.html).

    有关`InnoDB`和`自动增量`看见[第15.6.1.6节“自动\_InnoDB中的增量处理”](innodb-auto-increment-handling.html).有关`自动增量`和MySQL复制，请参阅[第17.5.1.1节，“复制和自动\_增量“](replication-features-auto-increment.html).

-   `议论`

    [](<>)

    可以使用`议论`选项，最多1024个字符。注释将显示在[`显示创建表`](show-create-table.html)和[`显示完整列`](show-columns.html)声明。它也显示在`专栏评论`专栏[`信息模式。柱`](information-schema-columns-table.html)桌子

-   `列格式`

    [](<>)

    在NDB集群中，还可以为数据的各个列指定数据存储格式[`NDB`](mysql-cluster.html)使用`列格式`.允许的列格式为`固定的`, `动态`和`违约`. `固定的`用于指定固定宽度的存储，`动态`允许列的宽度可变，以及`违约`使列使用由列的数据类型确定的固定宽度或可变宽度存储（可能由`行格式`说明符）。

    对于[`NDB`](mysql-cluster.html)表的默认值`列格式`是`固定的`.

    在NDB群集中，用定义的列的最大可能偏移量`列_格式=固定`是8188字节。有关更多信息和可能的解决方法，请参阅[第23.2.7.5节，“NDB集群中与数据库对象相关的限制”](mysql-cluster-limitations-database-objects.html).

    `列格式`目前对使用存储引擎的表列没有影响，而不是[`NDB`](mysql-cluster.html).MySQL 8.0默默忽略`列格式`.

-   `引擎属性`和`辅助引擎属性`选项（从MySQL 8.0.21开始提供）用于指定主存储引擎和辅助存储引擎的列属性。这些选项保留供将来使用。

    允许的值是包含有效`JSON`文档或空字符串（“”）。无效的`JSON`被拒绝。

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

    `引擎属性`和`辅助引擎属性`值可以无误地重复。在这种情况下，将使用最后指定的值。

    `引擎属性`和`辅助引擎属性`服务器不会检查值，也不会在更改表的存储引擎时清除这些值。

-   `存储`

    [](<>)

    对于[`NDB`](mysql-cluster.html)表中，可以使用`存储`条款`存储盘`使列存储在磁盘上，以及`存储存储器`导致内存中的存储被使用。这个[`创建表格`](create-table.html)使用的语句必须仍然包含`表空间`条款：

    ```
    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`](mysql-cluster.html)桌子，`存储默认值`相当于`存储存储器`.

    这个`存储`子句对使用存储引擎的表没有影响[`NDB`](mysql-cluster.html)这个`存储`关键字仅在的生成中受支持[**mysqld**](mysqld.html)与NDB集群一起提供的；它在任何其他版本的MySQL中都无法识别，任何试图使用`存储`关键字导致语法错误。

-   `总是产生`

    用于指定生成的列表达式。有关[生成的列](glossary.html#glos_generated_column)看见[第13.1.20.8节，“创建表格和生成的列”](create-table-generated-columns.html).

    [存储生成的列](glossary.html#glos_stored_generated_column)可以被索引。`InnoDB`支持上的二级索引[虚拟生成列](glossary.html#glos_virtual_generated_column)看见[第13.1.20.9节，“二级索引和生成列”](create-table-secondary-indexes.html).

#### 索引、外键和检查约束

有几个关键字可用于创建索引、外键和`检查`限制。除以下描述外，有关一般背景信息，请参见[第13.1.15节，“创建索引语句”](create-index.html), [第13.1.20.5节，“外键约束”](create-table-foreign-keys.html)和[第13.1.20.6节“检查约束”](create-table-check-constraints.html).

-   `约束*`象征`*`

    这个`约束*`象征`*`子句可以用来命名约束。如果没有给出该条款，或*`象征`*不包括以下内容：`限制`关键字，MySQL会自动生成一个约束名称，以下是一个例外。这个*`象征`*值（如果使用）在每个模式（数据库）和每个约束类型中必须是唯一的。复制品*`象征`*结果导致了一个错误。另请参见第页关于生成的约束标识符的长度限制的讨论[第9.2.1节，“标识符长度限制”](identifier-length.html).

    笔记

    如果`约束*`象征`*`子句未在外键定义中给出，或*`象征`*不包括以下内容：`限制`关键字，MySQL使用外键索引名，直到MySQL 8.0.15，然后自动生成约束名。

    SQL标准规定所有类型的约束（主键、唯一索引、外键、检查）都属于同一名称空间。在MySQL中，每个约束类型在每个模式中都有自己的名称空间。因此，每种类型的约束的名称在每个模式中都必须是唯一的，但不同类型的约束可以具有相同的名称。

-   `主键`

    [](<>)

    唯一索引，其中所有键列必须定义为`非空`.如果它们没有明确声明为`非空`，MySQL如此含蓄地（无声地）声明它们。一张桌子只能有一张`主键`.一家公司的名字`主键`总是`主要的，重要的`，因此不能用作任何其他类型索引的名称。

    如果你没有`主键`一个应用程序要求`主键`在表中，MySQL返回第一个`唯一的`没有`无效的`列作为`主键`.

    在里面`InnoDB`桌子，保持安静`主键`short可最大限度地减少二级索引的存储开销。每个辅助索引项都包含对应行的主键列的副本。（见[第15.6.2.1节，“聚集索引和二级索引”](innodb-index-types.html).)

    在创建的表中`主键`排在第一位，然后是所有`唯一的`索引，然后是非唯一索引。这有助于MySQL优化器确定要使用的索引的优先级，并更快地检测重复索引`唯一的`钥匙。

    A.`主键`可以是多列索引。但是，不能使用`主键`列规范中的键属性。这样做只会将单个列标记为主列。你必须使用单独的`主键(*`关键部分`*, ...)`条款

    [](<>)

    如果一张桌子有`主键`或`唯一非空`由具有整数类型的单个列组成的索引，您可以使用`_罗伊德`要引用中的索引列，请执行以下操作：[`选择`](select.html)声明，如中所述[唯一索引](create-index.html#create-index-unique).

    在MySQL中，一个`主键`是`主要的，重要的`。对于其他索引，如果未指定名称，则会为索引指定与第一个索引列相同的名称，并带有可选后缀(`_2`, `_3`, `...`)让它独一无二。您可以使用`显示来自的索引*`tbl\_名称`*`看见[第13.7.7.22节，“显示索引报表”](show-index.html).

-   `键|索引`

    `钥匙`通常是`指数`.关键属性`主键`也可以指定为`钥匙`当在列定义中给出时。这是为了与其他数据库系统兼容而实现的。

-   `唯一的`

    A.`唯一的`索引创建一个约束，使得索引中的所有值都必须是不同的。如果尝试添加键值与现有行匹配的新行，则会发生错误。对于所有发动机，a`唯一的`索引允许多个`无效的`可以包含`无效的`。如果为列表中的列指定前缀值`唯一的`索引，列值在前缀长度内必须是唯一的。

    [](<>)

    如果一张桌子有`主键`或`唯一非空`由具有整数类型的单个列组成的索引，您可以使用`_罗伊德`要引用中的索引列，请执行以下操作：[`选择`](select.html)声明，如中所述[唯一索引](create-index.html#create-index-unique).

-   `全文`

    A.`全文`索引是用于全文搜索的一种特殊类型的索引。只有[`InnoDB`](innodb-storage-engine.html)和[`米萨姆`](myisam-storage-engine.html)存储引擎支持`全文`索引。它们只能从[`烧焦`](char.html), [`瓦尔查尔`](char.html)和[`文本`](blob.html)柱。索引总是发生在整个列上；不支持列前缀索引，如果指定，则忽略任何前缀长度。看见[第12.10节，“全文搜索功能”](fulltext-search.html)，以获取操作细节。A.`使用解析器`子句可以指定为*`索引选项`*值，用于在全文索引和搜索操作需要特殊处理时将解析器插件与索引关联。本条款仅对下列人员有效：`全文`索引。[`InnoDB`](innodb-storage-engine.html)和[`米萨姆`](myisam-storage-engine.html)支持全文解析器插件。看见[全文解析器插件](https://dev.mysql.com/doc/extending-mysql/8.0/en/plugin-types.html#full-text-plugin-type)和[编写全文解析器插件](https://dev.mysql.com/doc/extending-mysql/8.0/en/writing-full-text-plugins.html)了解更多信息。

-   `空间的`

    你可以创造`空间的`空间数据类型的索引。空间类型仅支持`InnoDB`和`米萨姆`表和索引列必须声明为`非空`看见[第11.4节，“空间数据类型”](spatial-types.html).

-   `外键`

    MySQL支持外键，可以跨表交叉引用相关数据；外键约束有助于保持数据分布的一致性。有关定义和选项信息，请参见[*`参考定义`*](create-table.html#create-table-reference-definition)和[*`参考_选项`*](create-table.html#create-table-reference-option).

    使用[`InnoDB`](innodb-storage-engine.html)存储引擎不支持外键。看见[第24.6节，“分区的限制和限制”](partitioning-limitations.html)，以获取更多信息。

-   `检查`

    这个`检查`子句允许创建约束以检查表行中的数据值。看见[第13.1.20.6节“检查约束”](create-table-check-constraints.html).

-   `*`关键部分`*`

    -   A.*`关键部分`*规范可以以`ASC`或`描述`指定索引值是按升序还是降序存储。如果没有给出顺序说明符，则默认值为升序。

    -   前缀，由*`长`*属性，最长可为767字节`InnoDB`使用`[REDUNDANT]（glossary.html#glos_REDUNDANT_row_格式）`或`[COMPACT]（glossary.html#glos_COMPACT_row_格式）`行格式。前缀长度限制为3072字节`InnoDB`使用`[DYNAMIC]（glossary.html#glos_DYNAMIC_row_格式）`或`[压缩]（glossary.html#glos_COMPRESSED_row_格式）`行格式。对于`米萨姆`表中，前缀长度限制为1000字节。

        前缀*限制*以字节为单位。但是，前缀*长度*有关中的索引规范[`创建表格`](create-table.html), [`改变桌子`](alter-table.html)和[`创建索引`](create-index.html)语句被解释为非二进制字符串类型的字符数([`烧焦`](char.html), [`瓦尔查尔`](char.html), [`文本`](blob.html))以及二进制字符串类型的字节数([`二进制的`](binary-varbinary.html), [`VARBINARY`](binary-varbinary.html), [`斑点`](blob.html))。为使用多字节字符集的非二进制字符串列指定前缀长度时，请考虑这一点。

    -   从MySQL 8.0.17开始*`expr`*暂时*`关键部分`*规范可以采取以下形式：`（演员）*`json\_路径`*作为*`类型`*阵列）`在数据库上创建多值索引的步骤[`JSON`](json.html)柱[多值索引](create-index.html#create-index-multi-valued)，提供有关多值索引的创建、使用以及限制和限制的详细信息。

-   `*`索引类型`*`

    某些存储引擎允许您在创建索引时指定索引类型。的语法*`索引类型`*说明符是`使用*`输入你的名字`*`.

    例子：

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

    你最喜欢的职位是什么`使用`在索引列列表之后。它可以在列列表之前给出，但不推荐在该位置使用该选项，您应该希望在未来的MySQL版本中删除它。

-   `*`索引选项`*`

    *`索引选项`*值指定索引的其他选项。

    -   `键块大小`

        对于[`米萨姆`](myisam-storage-engine.html)桌子，`键块大小`（可选）指定用于索引键块的大小（以字节为单位）。该值被视为提示；如有必要，可以使用不同的尺寸。A.`键块大小`为单个索引定义指定的值将覆盖表级别`键块大小`价值

        有关表格级别的信息`键块大小`属性，参见[表格选项](create-table.html#create-table-options).

    -   `使用解析器`

        这个`使用解析器`选项只能与一起使用`全文`索引。如果全文索引和搜索操作需要特殊处理，它会将解析器插件与索引相关联。[`InnoDB`](innodb-storage-engine.html)和[`米萨姆`](myisam-storage-engine.html)支持全文解析器插件。如果你有[`米萨姆`](myisam-storage-engine.html)带有相关全文解析器插件的表，可以将该表转换为`InnoDB`使用`改变桌子`.

    -   `议论`

        索引定义可以包含最多1024个字符的可选注释。

        你可以设定`InnoDB` `合并阈值`使用`*`索引选项`*` `议论`条款看见[第15.8.11节，“为索引页配置合并阈值”](index-page-merge-threshold.html).

    -   `看得见的`, `看不见的`

        指定索引可见性。默认情况下，索引是可见的。优化器不使用不可见索引。索引可见性规范适用于主键以外的索引（显式或隐式）。有关更多信息，请参阅[第8.3.12节，“无形指数”](invisible-indexes.html).

        [](<>)

    -   `引擎属性`和`辅助引擎属性`选项（从MySQL 8.0.21开始提供）用于指定主存储引擎和辅助存储引擎的索引属性。这些选项保留供将来使用。

        有关许可的更多信息*`索引选项`*价值观，参见[第13.1.15节，“创建索引语句”](create-index.html)。有关索引的更多信息，请参阅[第8.3.1节，“MySQL如何使用索引”](mysql-indexes.html).

-   [](<>) `*`参考定义`*`

    对于*`参考定义`*语法详细信息和示例，请参见[第13.1.20.5节，“外键约束”](create-table-foreign-keys.html).

    [`InnoDB`](innodb-storage-engine.html)和[`NDB`](mysql-cluster.html)表支持检查外键约束。引用表的列必须始终显式命名。二者都`删除时`和`更新`支持外键操作。有关更多详细信息和示例，请参阅[第13.1.20.5节，“外键约束”](create-table-foreign-keys.html).

    对于其他存储引擎，MySQL服务器解析并忽略`外键`语法[`创建表格`](create-table.html)声明。

    重要的

    对于熟悉ANSI/ISO SQL标准的用户，请注意没有存储引擎，包括`InnoDB`，承认或执行`火柴`在引用完整性约束定义中使用的子句。使用明确的`火柴`子句不具有指定的效果，也会导致`删除时`和`更新`不可忽视的条款。出于这些原因，请指定`火柴`应该避免。

    这个`火柴`SQL标准中的子句控制如何`无效的`复合（多列）外键中的值在与主键进行比较时进行处理。`InnoDB`本质上实现了`简单匹配`，允许全部或部分使用外键`无效的`.在这种情况下，允许插入包含此类外键的（子表）行，并且与引用的（父表）表中的任何行都不匹配。可以使用触发器实现其他语义。

    此外，MySQL要求对引用的列进行索引以提高性能。然而`InnoDB`不强制要求声明引用的列`唯一的`或`非空`.外键引用非唯一键或包含`无效的`没有为以下操作定义好值：`使现代化`或`删除级联`.建议您使用外键，该外键只引用同时具有`唯一的`（或`主要的，重要的`)及`非空`.

    MySQL解析但忽略“内联”`推荐人`规范”（如SQL标准中所定义），其中引用被定义为列规范的一部分。MySQL接受`推荐人`仅当指定为单独合同的一部分时`外键`规格有关更多信息，请参阅[第1.7.2.3节，“外键约束差异”](ansi-diff-foreign-keys.html).

-   [](<>) `*`参考\_选项`*`

    有关`限制`, `大量`, `设为空`, `不采取行动`和`设置默认值`选项，请参见[第13.1.20.5节，“外键约束”](create-table-foreign-keys.html).

#### 表格选项

表选项用于优化表的行为。在大多数情况下，您不必指定其中任何一个。除非另有说明，否则这些选项适用于所有存储引擎。不适用于给定存储引擎的选项可能会作为表定义的一部分被接受和记住。如果以后使用，这些选项将适用[`改变桌子`](alter-table.html)将表转换为使用不同的存储引擎。

-   `发动机`

    使用下表中显示的名称之一指定表的存储引擎。引擎名称可以是不带引号的，也可以是带引号的。引用的名字`“违约”`被承认但被忽视。

    | 存储引擎 | 描述 |
    | ---- | --- |
    | `InnoDB` | 具有行锁定和外键的事务安全表。新表的默认存储引擎。看见[第15章，*InnoDB存储引擎*](innodb-storage-engine.html)，尤其是[第15.1节，“InnoDB简介”](innodb-introduction.html)如果你有MySQL的经验，但对`InnoDB`. |
    | `米萨姆` | 主要用于只读或以读为主的工作负载的二进制便携式存储引擎。看见[第16.2节，“MyISAM存储引擎”](myisam-storage-engine.html). |
    | `记忆力` | 此存储引擎的数据仅存储在内存中。看见[第16.3节，“内存存储引擎”](memory-storage-engine.html). |
    | `CSV` | 以逗号分隔值格式存储行的表。看见[第16.4节，“CSV存储引擎”](csv-storage-engine.html). |
    | `档案文件` | 归档存储引擎。看见[第16.5节，“归档存储引擎”](archive-storage-engine.html). |
    | `实例` | 一个示例引擎。看见[第16.9节，“示例存储引擎”](example-storage-engine.html). |
    | `联邦的` | 访问远程表的存储引擎。看见[第16.8节，“联邦存储引擎”](federated-storage-engine.html). |
    | `堆` | 这是`记忆力`. |
    | `合并` | 一系列`米萨姆`用作一张桌子的桌子。也称为`MRG_MyISAM`看见[第16.7节，“合并存储引擎”](merge-storage-engine.html). |
    | [`NDB`](mysql-cluster.html) | 群集、容错、基于内存的表，支持事务和外键。也称为[`NDBCLUSTER`](mysql-cluster.html)看见[第23章，*MySQL NDB Cluster 8.0*](mysql-cluster.html). |

    默认情况下，如果指定的存储引擎不可用，则该语句将失败并出现错误。您可以通过删除[`没有引擎替换`](sql-mode.html#sqlmode_no_engine_substitution)从服务器SQL模式（请参阅[第5.1.11节，“服务器SQL模式”](sql-mode.html))因此，MySQL允许用默认存储引擎替换指定的引擎。通常在这种情况下，这是`InnoDB`，这是[`默认存储引擎`](server-system-variables.html#sysvar_default_storage_engine)系统变量。什么时候`没有引擎替换`禁用时，如果不遵守存储引擎规范，则会出现警告。

-   `自动扩展大小`

    定义所需的数量`InnoDB`当表空间满时扩展表空间的大小。在MySQL 8.0.23中引入。该设置必须是4MB的倍数。默认设置为0，这会根据隐式默认行为扩展表空间。有关更多信息，请参阅[第15.6.3.9节，“表空间自动扩展”\_“尺寸配置”](innodb-tablespace-autoextend-size.html).

-   `自动增量`

    首字母`自动增量`表的值。在MySQL 8.0中，这适用于`米萨姆`, `记忆力`, `InnoDB`和`档案文件`桌子。为不支持自动增量的发动机设置第一个自动增量值`自动增量`table选项，在创建表后插入一个值小于所需值1的“虚拟”行，然后删除虚拟行。

    对于支持`自动增量`中的表选项[`创建表格`](create-table.html)语句，也可以使用`改变桌子*`tbl\_名称`*自动增量=*`N`*`重置`自动增量`价值该值不能低于列中当前的最大值。

-   `平均行长`

    表的平均行长的近似值。您只需要为具有可变大小行的大型表设置此选项。

    当你创建一个`米萨姆`表中，MySQL使用`最大排数`和`平均行长`选项来决定结果表的大小。如果未指定任一选项，则`米萨姆`默认情况下，数据和索引文件为256TB。（如果您的操作系统不支持这么大的文件，则表大小受文件大小限制。）如果您希望减小指针大小以使索引更小更快，并且不需要大文件，可以通过设置[`myisam_数据_指针_大小`](server-system-variables.html#sysvar_myisam_data_pointer_size)系统变量。（见[第5.1.8节“服务器系统变量”](server-system-variables.html)）如果希望所有表的增长速度都能超过默认限制，并且希望表的速度稍微慢一点，并且比需要的大一点，则可以通过设置此变量来增加默认指针大小。如果将该值设置为7，则允许表格大小达到65536TB。

-   `[默认]字符集`

    指定表格的默认字符集。`CHARSET`是的同义词`字符集`.如果字符集名称为`违约`，使用数据库字符集。

-   `校验和`

    如果希望MySQL为所有行维护实时校验和（也就是说，MySQL会随着表的更改自动更新校验和），请将其设置为1。这会使表的更新速度稍慢，但也会使查找损坏的表变得更容易。这个[`校验和表`](checksum-table.html)语句报告校验和。(`米萨姆`仅此而已。）

-   `[默认]整理`

    指定表的默认排序规则。

-   `议论`

    表的注释，最长2048个字符。

    你可以设定`InnoDB` `合并阈值`使用`*`表\_选项`*` `议论`条款看见[第15.8.11节，“为索引页配置合并阈值”](index-page-merge-threshold.html).

    [](<>)**设置NDB\_表格选项。**  [](<>)表格中的注释`创建表格`这就产生了`NDB`桌子还是桌子[`改变桌子`](alter-table.html)语句也可以用来指定一到四个`NDB_表`选项`不记录`, `读取备份`, `分区平衡`或`完全复制`作为一组名称-值对，如果需要，用逗号分隔，紧跟在字符串后面`NDB_表=`这是引用的评论文本的开头。此处显示了使用此语法的示例语句（强调文本）：

    ```
    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.html)。注释的文本也可在下表中找到\_MySQL信息模式的注释列[`桌子`](information-schema-tables-table.html)桌子

    此注释语法也受[`改变桌子`](alter-table.html)声明`NDB`桌子。请记住，表注释与`改变桌子`替换表中可能存在的任何现有注释。

    设定`合并阈值`不支持表注释中的选项[`NDB`](mysql-cluster.html)表（被忽略）。

    有关完整的语法信息和示例，请参阅[第13.1.20.11节，“设置NDB注释选项”](create-table-ndb-comment-options.html).

-   `压缩`

    用于页面级压缩的压缩算法`InnoDB`桌子。支持的值包括`兹利布`, `LZ4`和`没有一个`这个`压缩`属性是通过透明页面压缩特性引入的。页面压缩仅支持`InnoDB`位于[每个表的文件数](glossary.html#glos_file_per_table)表空间，并且仅在支持稀疏文件和打孔的Linux和Windows平台上可用。有关更多信息，请参阅[第15.9.2节，“InnoDB页面压缩”](innodb-page-compression.html).

-   `联系`

    的连接字符串`联邦的`桌子

    笔记

    MySQL的旧版本使用了`议论`连接字符串的选项。

-   `数据目录`, `索引目录`

    对于`InnoDB`这个`数据目录*`目录`*'`子句允许在数据目录之外创建表。这个[`innodb_文件_每个_表`](innodb-parameters.html#sysvar_innodb_file_per_table)必须启用变量才能使用`数据目录`条款必须指定完整的目录路径。从MySQL 8.0.21开始，用户必须知道指定的目录`InnoDB`。有关更多信息，请参阅[第15.6.1.2节“外部创建表格”](innodb-create-table-external.html).

    创建时`米萨姆`桌子，你可以使用`数据目录*`目录`*'`条款`索引目录*`目录`*'`子句，或两者兼而有之。它们指定了在哪里放置标签`米萨姆`表的数据文件和索引文件。不像`InnoDB`表，MySQL在创建数据库时不会创建与数据库名称对应的子目录`米萨姆`有一张桌子`数据目录`或`索引目录`选项在指定的目录中创建文件。

    你一定有[`文件`](privileges-provided.html#priv_file)使用`数据目录`或`索引目录`表格选项。

    重要的

    桌面`数据目录`和`索引目录`对于分区表，选项被忽略。（Bug#32091）

    这些选项仅在不使用[`--跳过符号链接`](server-options.html#option_mysqld_symbolic-links)选项您的操作系统还必须有一个线程安全的工作系统`realpath（）`呼叫看见[第8.12.2.2节，“在Unix上为MyISAM表使用符号链接”](symbolic-links-to-tables.html)，以获取更完整的信息。

    如果`米萨姆`表创建时没有`数据目录`选择权`MYD先生`文件在数据库目录中创建。默认情况下，如果`米萨姆`查找现有的`MYD先生`文件在这种情况下，它会覆盖它。这同样适用于`MYI先生`创建的表的文件没有`索引目录`选项要抑制此行为，请使用[`--保持文件在创建状态`](server-system-variables.html#sysvar_keep_files_on_create)选项，在这种情况下`米萨姆`不会覆盖现有文件，而是返回错误。

    如果`米萨姆`表是用`数据目录`或`索引目录`选项和现有的`MYD先生`或`MYI先生`找到文件后，`米萨姆`始终返回错误，并且不会覆盖指定目录中的文件。

    重要的

    不能使用包含MySQL数据目录的路径名`数据目录`或`索引目录`。这包括分区表和单个表分区。（见Bug#32167）

-   `延迟按键写入`

    如果要将表的键更新延迟到表关闭，请将其设置为1。请参见对[`延迟按键写入`](server-system-variables.html#sysvar_delay_key_write)系统变量[第5.1.8节“服务器系统变量”](server-system-variables.html). (`米萨姆`仅此而已。）

-   `加密`

    这个`加密`子句启用或禁用对`InnoDB`桌子在启用加密之前，必须安装并配置密钥环插件。在MySQL 8.0.16之前`加密`子句只能在每个表空间的文件中创建表时指定。从MySQL 8.0.16开始`加密`子句也可以在常规表空间中创建表时指定。

    从MySQL 8.0.16开始，如果`加密`未指定第条。如果[`表_加密_权限_检查`](server-system-variables.html#sysvar_table_encryption_privilege_check)变量启用时[`表_加密_管理`](privileges-provided.html#priv_table-encryption-admin)创建具有`加密`与默认架构加密不同的子句设置。在常规表空间中创建表时，表和表空间加密必须匹配。

    从MySQL 8.0.16开始，指定`加密`值不是`“不”`或`''`使用不支持加密的存储引擎时不允许使用。此前，该条款被接受。

    有关更多信息，请参阅[第15.13节，“InnoDB静态数据加密”](innodb-data-encryption.html).

-   `引擎属性`和`辅助引擎属性`选项（从MySQL 8.0.21开始提供）用于指定主存储引擎和辅助存储引擎的表属性。这些选项保留供将来使用。

    允许的值是包含有效`JSON`文档或空字符串（“”）。无效的`JSON`被拒绝。

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

    `引擎属性`和`辅助引擎属性`值可以无误地重复。在这种情况下，将使用最后指定的值。

    `引擎属性`和`辅助引擎属性`服务器不会检查值，也不会在更改表的存储引擎时清除这些值。

-   `插入法`

    如果要将数据插入到`合并`表中，必须使用`插入法`应插入行的表。`插入法`一个选项对你有用吗`合并`只有桌子。使用值`第一`或`最后的`要使insert转到第一个或最后一个表，或`不`防止插入。看见[第16.7节，“合并存储引擎”](merge-storage-engine.html).

-   `键块大小`

    对于[`米萨姆`](myisam-storage-engine.html)桌子，`键块大小`（可选）指定用于索引键块的大小（以字节为单位）。该值被视为提示；如有必要，可以使用不同的尺寸。A.`键块大小`为单个索引定义指定的值将覆盖表级别`键块大小`价值

    对于[`InnoDB`](innodb-storage-engine.html)桌子，`键块大小`指定[页](glossary.html#glos_page)要用于的大小（以KB为单位）[压缩的](glossary.html#glos_compression) `InnoDB`桌子。这个`键块大小`价值被视为一种暗示；用户可以使用不同的尺寸`InnoDB`如果必要的话。`键块大小`只能小于或等于[`innodb_页面大小`](innodb-parameters.html#sysvar_innodb_page_size)价值值0表示默认的压缩页面大小，即[`innodb_页面大小`](innodb-parameters.html#sysvar_innodb_page_size)价值取决于[`innodb_页面大小`](innodb-parameters.html#sysvar_innodb_page_size)可能的`键块大小`值包括0、1、2、4、8和16。看见[第15.9.1节，“InnoDB表压缩”](innodb-table-compression.html)了解更多信息。

    Oracle建议启用[`innodb_严格模式`](innodb-parameters.html#sysvar_innodb_strict_mode)指定时`键块大小`对于`InnoDB`桌子。什么时候[`innodb_严格模式`](innodb-parameters.html#sysvar_innodb_strict_mode)已启用，指定了无效的`键块大小`值返回一个错误。如果[`innodb_严格模式`](innodb-parameters.html#sysvar_innodb_strict_mode)是残疾人`键块大小`值将导致警告，而`键块大小`选项被忽略。

    这个`创建_选项`专栏回应[`显示表格状态`](show-table-status.html)报告实际情况`键块大小`桌子上用的，桌子上也用[`显示创建表`](show-create-table.html).

    `InnoDB`只支持`键块大小`在餐桌上。

    `键块大小`32KB和64KB不支持[`innodb_页面大小`](innodb-parameters.html#sysvar_innodb_page_size)价值观`InnoDB`表压缩不支持这些页面大小。

    `InnoDB`不支持`键块大小`创建临时表时的选项。

-   `最大排数`

    计划存储在表中的最大行数。这不是一个硬性限制，而是向存储引擎提示，表必须能够存储至少这么多行。

    [](<>)[](<>)[](<>)[](<>)

    重要的

    使用`最大排数`具有`NDB`不推荐使用控制表分区数量的表。为了向后兼容，它在以后的版本中仍受支持，但在将来的版本中可能会被删除。使用分区\_取而代之的是平衡；看见[设置NDB\_表格选项](create-table.html#create-table-comment-ndb-table-options).

    这个[`NDB`](mysql-cluster.html)存储引擎将此值视为最大值。如果您计划创建非常大的NDB集群表（包含数百万行），那么应该使用此选项来确保[`NDB`](mysql-cluster.html)在哈希表中分配足够数量的索引槽，用于通过设置`最大行数=2**`排`*`哪里*`排`*是希望插入到表中的行数。

    最大值`最大排数`数值为4294967295；较大的值将被截断到此限制。

-   `MIN_ROWS`

    计划存储在表中的最小行数。这个[`记忆力`](memory-storage-engine.html)存储引擎使用此选项作为有关内存使用的提示。

-   `打包钥匙`

    仅在以下情况下生效：`米萨姆`桌子。如果希望索引更小，请将此选项设置为1。这通常会使更新速度变慢，读取速度变快。将选项设置为0将禁用所有密钥打包。设置为`违约`告诉存储引擎只打包很长时间[`烧焦`](char.html), [`瓦尔查尔`](char.html), [`二进制的`](binary-varbinary.html)或[`VARBINARY`](binary-varbinary.html)柱。

    如果你不使用`打包钥匙`，默认是打包字符串，而不是数字。如果你使用`打包钥匙=1`，数字也被打包了。

    在打包二进制数密钥时，MySQL使用前缀压缩：

    -   每个键都需要一个额外的字节来指示前一个键中有多少字节与下一个键相同。

    -   指向该行的指针直接存储在键后的高字节第一顺序中，以提高压缩效率。

        这意味着，如果在两个连续的行上有许多相等的键，那么后面的所有“相同”键通常只占用两个字节（包括指向该行的指针）。将其与以下按键使用的普通情况进行比较`存储\u大小\u键+指针\u大小`（指针大小通常为4）。相反，只有当你有许多相同的数字时，你才能从前缀压缩中获得显著的好处。如果所有的键都完全不同，那么如果该键不是可以使用的键，则每个键多使用一个字节`无效的`价值观（在这种情况下，压缩密钥长度存储在用于标记密钥是否正确的字节中。）`无效的`.)

-   `暗语`

    此选项未使用。

-   `行格式`

    定义存储行的物理格式。

    使用创建表时[严格模式](glossary.html#glos_strict_mode)禁用时，如果不支持指定的行格式，则使用存储引擎的默认行格式。表的实际行格式在`行格式`专栏回应[`显示表格状态`](show-table-status.html)这个`创建_选项`列显示在中指定的行格式[`创建表格`](create-table.html)声明，我也是[`显示创建表`](show-create-table.html).

    行格式选择因表所用的存储引擎而异。

    对于`InnoDB`桌子：

    -   默认行格式由[`innodb_默认_行_格式`](innodb-parameters.html#sysvar_innodb_default_row_format)，其默认设置为`动态`。当`行格式`选项未定义或`行\格式=默认值`被使用了。

        如果`行格式`选项未定义，或者`行\格式=默认值`使用时，重建表的操作也会将表的行格式静默更改为[`innodb_默认_行_格式`](innodb-parameters.html#sysvar_innodb_default_row_format)。有关更多信息，请参阅[定义表的行格式](innodb-row-format.html#innodb-row-format-defining).

    -   为了更高效`InnoDB`数据类型的存储，尤其是[`斑点`](blob.html)类型，使用`动态`看见[动态行格式](innodb-row-format.html#innodb-row-format-dynamic)对于与`动态`行格式。

    -   要启用压缩，请执行以下操作：`InnoDB`表格，指定`行_格式=压缩`这个`行_格式=压缩`创建临时表时不支持选项。看见[第15.9节，“InnoDB表格和页面压缩”](innodb-compression.html)对于与`压缩的`行格式。

    -   通过指定`冗余的`行格式。

    -   指定非默认值时`行格式`子句，还考虑启用[`innodb_严格模式`](innodb-parameters.html#sysvar_innodb_strict_mode)配置选项。

    -   `行格式=固定`不支持。如果`行格式=固定`是在[`innodb_严格模式`](innodb-parameters.html#sysvar_innodb_strict_mode)是残疾的，`InnoDB`发出警告并假设`行格式=动态`如果`行格式=固定`是在[`innodb_严格模式`](innodb-parameters.html#sysvar_innodb_strict_mode)已启用，这是默认值，`InnoDB`返回一个错误。

    -   有关`InnoDB`行格式，请参见[第15.10节，“InnoDB行格式”](innodb-row-format.html).

        对于`米萨姆`表中，选项值可以是`固定的`或`动态`用于静态或可变长度行格式。[**myisampack**](myisampack.html)将类型设置为`压缩的`看见[第16.2.3节，“MyISAM表格存储格式”](myisam-table-formats.html).

        对于[`NDB`](mysql-cluster.html)表，默认值`行格式`是`动态`.

-   `统计数据自动更新`

    指定是否自动重新计算[持久性统计数据](glossary.html#glos_persistent_statistics)为了一个`InnoDB`桌子价值`违约`使表的持久性统计设置由[`innodb_stats_auto_recalc`](innodb-parameters.html#sysvar_innodb_stats_auto_recalc)配置选项。价值`1.`当表中10%的数据发生更改时，导致重新计算统计信息。价值`0`防止自动重新计算此表；使用此设置，发布一个[`分析表`](analyze-table.html)对表格进行重大更改后重新计算统计数据的语句。有关持久性统计信息功能的更多信息，请参阅[第15.8.10.1节，“配置持久优化器统计参数”](innodb-persistent-stats.html).

-   `持久的`

    指定是否启用[持久性统计数据](glossary.html#glos_persistent_statistics)为了一个`InnoDB`桌子价值`违约`使表的持久性统计设置由[`innodb_stats_persistent`](innodb-parameters.html#sysvar_innodb_stats_persistent)配置选项。价值`1.`启用表的持久统计信息，而`0`关闭此功能。通过`创建表格`或`改变桌子`声明，发布[`分析表`](analyze-table.html)语句来计算统计数据，然后将代表性数据加载到表中。有关持久性统计信息功能的更多信息，请参阅[第15.8.10.1节，“配置持久优化器统计参数”](innodb-persistent-stats.html).

-   `统计数据样本页面`

    在估计索引列的基数和其他统计信息（例如由[`分析表`](analyze-table.html)。有关更多信息，请参阅[第15.8.10.1节，“配置持久优化器统计参数”](innodb-persistent-stats.html).

-   `表空间`

    这个`表空间`子句可用于在现有常规表空间、每个表的文件表空间或系统表空间中创建表。

    ```
    CREATE TABLE tbl_name ... TABLESPACE [=] tablespace_name
    ```

    在使用之前，您指定的常规表空间必须存在`表空间`条款有关常规表空间的信息，请参阅[第15.6.3.3节，“通用表空间”](general-tablespaces.html).

    这个`*`表空间名称`*`是区分大小写的标识符。它可以被引用，也可以不被引用。不允许使用正斜杠字符（“/”）。以“innodb”开头的名称\_“是为特殊用途保留的。

    要在系统表空间中创建表，请指定`innodb_系统`作为表空间名称。

    ```
    CREATE TABLE tbl_name ... TABLESPACE [=] innodb_system
    ```

    使用`表空间[=]innodb_系统`，可以在系统表空间中放置任何未压缩行格式的表，而不考虑[`innodb_文件_每个_表`](innodb-parameters.html#sysvar_innodb_file_per_table)背景例如，可以添加带有`行格式=动态`使用`表空间[=]innodb_系统`.

    要在每个表空间的文件中创建表，请指定`innodb_文件_每个_表`作为表空间名称。

    ```
    CREATE TABLE tbl_name ... TABLESPACE [=] innodb_file_per_table
    ```

    笔记

    如果[`innodb_文件_每个_表`](innodb-parameters.html#sysvar_innodb_file_per_table)如果已启用，则无需指定`TABLESPACE=innodb_file_per_table`创建一个`InnoDB`每个表空间的文件数。`InnoDB`默认情况下，当[`innodb_文件_每个_表`](innodb-parameters.html#sysvar_innodb_file_per_table)已启用。

    这个`数据目录`第条是允许的`创建表格。。。TABLESPACE=innodb_file_per_table`但在其他方面不支持与`表空间`条款从MySQL 8.0.21开始，在`数据目录`条款必须为所有人所知`InnoDB`。有关更多信息，请参阅[使用数据目录子句](innodb-create-table-external.html#innodb-create-table-external-data-directory).

    笔记

    支持`TABLESPACE=innodb_file_per_table`和`表空间=innodb_临时`带有[`创建临时表`](create-table.html)从MySQL 8.0.13开始就被弃用；预计它将在MySQL的未来版本中被删除。

    这个`存储`表选项仅用于[`NDB`](mysql-cluster.html)桌子。`存储`确定使用的存储类型（磁盘或内存），可以是`磁盘`或`记忆力`.

    `表空间。。。存储盘`将表分配给NDB群集磁盘数据表空间。表空间必须已经使用创建[`创建表空间`](create-tablespace.html)看见[第23.6.10节，“NDB群集磁盘数据表”](mysql-cluster-disk-data.html)，以获取更多信息。

    重要的

    A.`存储`子句不能用于[`创建表格`](create-table.html)不带签名的声明`表空间`条款

-   [`协会`](union.html)

    用于访问相同的`米萨姆`一张桌子。这只适用于`合并`桌子。看见[第16.7节，“合并存储引擎”](merge-storage-engine.html).

    你一定有[`选择`](privileges-provided.html#priv_select), [`使现代化`](privileges-provided.html#priv_update)和[`删去`](privileges-provided.html#priv_delete)映射到的表的权限`合并`桌子

    笔记

    以前，所有使用的表都必须与`合并`桌子本身。这一限制不再适用。

#### 表分区

*`分区选项`*可用于控制使用创建的表的分区[`创建表格`](create-table.html).

不是语法中显示的所有选项*`分区选项`*在本节开头，所有分区类型都可以使用。有关每种类型的特定信息，请参阅以下各个类型的列表，并参阅[第24章，*分割*](partitioning.html)，以获取有关MySQL中分区的工作和使用的更完整信息，以及表创建的其他示例和与MySQL分区相关的其他语句。

分区可以修改、合并、添加到表中，也可以从表中删除。有关完成这些任务的MySQL语句的基本信息，请参阅[第13.1.9节“更改表格声明”](alter-table.html)。有关更多详细说明和示例，请参阅[第24.3节，“分区管理”](partitioning-management.html).

-   `分割`

    如果使用，则为*`分区选项`*条款以开头`分割`.本条款包含用于确定分区的函数；该函数返回一个从1到1的整数值*`号码`*哪里*`号码`*是分区的数量。（一个表可以包含的用户定义分区的最大数量为1024个；本节后面讨论的子分区的数量包含在该最大数量中。）

    笔记

    表情(*`expr`*)用于`分割`子句不能引用不在正在创建的表中的任何列；这种引用是特别不允许的，会导致语句失败并出现错误。（错误#29444）

-   `散列(*`expr`*)`

    散列一个或多个列，以创建用于放置和定位行的键。*`expr`*是使用一个或多个表列的表达式。这可以是任何生成单个整数值的有效MySQL表达式（包括MySQL函数）。例如，它们都是有效的[`创建表格`](create-table.html)使用`哈希分区`:

    ```
    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) );
    ```

    两种方法都不能使用`价值低于`或`价值观`带有`哈希分区`.

    `哈希分区`使用剩余的*`expr`*除以分区数（即模数）。有关示例和其他信息，请参阅[第24.2.4节，“哈希分区”](partitioning-hash.html).

    这个`线性的`关键字需要一个稍微不同的算法。在这种情况下，作为一个或多个逻辑分区的结果，计算存储行的分区数[`和`](logical-operators.html#operator_and)操作。有关线性哈希的讨论和示例，请参阅[第24.2.4.1节，“线性哈希分区”](partitioning-linear-hash.html).

-   `钥匙(*`列列表`*)`

    这与`搞砸`，除了MySQL提供散列功能以保证数据分布均匀之外。这个*`列列表`*参数只是一个包含1个或多个表列的列表（最多16列）。本例显示了一个按键分区的简单表，共有4个分区：

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

    对于按键分区的表，可以使用`线性的`关键词。这与按分区的表具有相同的效果`搞砸`.也就是说，分区号是使用[`&`](bit-functions.html#operator_bitwise-and)运算符而不是模数（参见[第24.2.4.1节，“线性哈希分区”](partitioning-linear-hash.html)和[第24.2.5节，“密钥分区”](partitioning-key.html)，以获取详细信息）。本例使用按键线性分区在5个分区之间分配数据：

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

    这个`算法={1 | 2}`选项受`按[LINEAR]键[SUB]分区`. `算法=1`使服务器使用与MySQL 5.1相同的密钥哈希函数；`算法=2`这意味着服务器使用默认情况下为新应用程序实现和使用的密钥散列函数`钥匙`MySQL 5.5及更高版本中的分区表。（使用MySQL 5.5及更高版本中使用的密钥散列函数创建的分区表不能被MySQL 5.1服务器使用。）不指定选项的效果与使用相同`算法=2`。此选项主要用于升级或降级`[线性]键`MySQL 5.1和更高版本MySQL之间的分区表，或用于创建按`钥匙`或`线性键`在MySQL 5.5或更高版本的服务器上，可以在MySQL 5.1服务器上使用。有关更多信息，请参阅[第13.1.9.1节，“更改表分区操作”](alter-table-partition-operations.html).

    [**mysqldump**](mysqldump.html)在MySQL 5.7（及更高版本）中，将此选项封装在版本化注释中，如下所示：

    ```
    CREATE TABLE t1 (a INT)
    /*!50100 PARTITION BY KEY */ /*!50611 ALGORITHM = 1 */ /*!50100 ()
          PARTITIONS 3 */
    ```

    这会导致MySQL 5.6.10及更早版本的服务器忽略该选项，否则会在这些版本中导致语法错误。如果您计划加载MySQL 5.7服务器上的转储文件，在该服务器上使用按`钥匙`在5.6.11之前的MySQL 5.6服务器中，请务必咨询[MySQL 5.6的变化](https://dev.mysql.com/doc/refman/5.6/en/upgrading-from-previous-series.html)，然后继续。（如果您正在加载包含`钥匙`从MySQL 5.7-5.6.11或更高版本的服务器到MySQL 5.5.30或更早版本的服务器的分区或子分区表。）

    同样在MySQL 5.6.11及更高版本中，`算法=1`必要时显示在的输出中[`显示创建表`](show-create-table.html)使用版本化注释的方式与[**mysqldump**](mysqldump.html). `算法=2`总是被省略`显示创建表`输出，即使在创建原始表时指定了此选项。

    两种方法都不能使用`价值低于`或`价值观`带有`按键分区`.

-   `射程(*`expr`*)`

    在这种情况下，*`expr`*使用一组`价值低于`接线员。使用范围分区时，必须使用`价值低于`.你不能使用`价值观`使用范围分区。

    笔记

    对于按分区的表`范围`, `价值低于`必须与整型文字值或计算为单个整数值的表达式一起使用。在MySQL 8.0中，可以在使用`按范围列划分`，如本节下文所述。

    假设您有一个表，希望根据以下方案在包含年份值的列上进行分区。

    | 分区号： | 年份范围： |
    | ---- | ----- |
    | 0 | 1990年及以前 |
    | 1. | 1991年至1994年 |
    | 2. | 1995年至1998年 |
    | 3. | 1999年至2002年 |
    | 4. | 2003年至2005年 |
    | 5. | 2006年及以后 |

    实现这种分区方案的表可以通过[`创建表格`](create-table.html)声明如下：

    ```
    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
    );
    ```

    `隔断价值低于。。。`语句以连续的方式工作。`小于MAXVALUE的值`用于指定大于其他指定的最大值的“剩余”值。

    `价值低于`子句的顺序工作方式与`案例`部分`转换案例`块（在许多编程语言中都可以找到，比如C、Java和PHP）。也就是说，条款的排列方式必须确保每个连续条款中规定的上限`价值低于`大于上一个，其中一个引用`最大值`排在最后。

-   `范围列(*`列列表`*)`

    这个变种`范围`有助于使用多列上的范围条件（即具有以下条件）对查询进行分区修剪：`其中a=1，b<10`或`其中a=1，b=10，c<10`)。它使您能够使用中的列列表指定多列中的值范围`柱`子句和每个`隔断价值低于(*`价值清单`*)`分区定义子句。（在最简单的情况下，该集合由一列组成。）中可以引用的最大列数*`列列表`*和*`价值清单`*她16岁。

    这个*`列列表`*用于`柱`子句只能包含列的名称；列表中的每一列必须是以下MySQL数据类型之一：整数类型；字符串类型；以及时间或日期列类型。使用`斑点`, `文本`, `设置`, `枚举`, `一点`，或不允许使用空间数据类型；也不允许使用浮点数类型的列。也不能在中使用函数或算术表达式`柱`条款

    这个`价值低于`在分区定义中使用的子句必须为`列（）`条款也就是说，每个`价值低于`子句包含的值数必须与中列出的列数相同`柱`条款试图在数据中使用更多或更少的值`价值低于`子句中没有的`柱`子句导致语句失败，错误是使用列列表进行分区时不一致。。。。你不能使用`无效的`对于任何出现在`价值低于`.有可能使用`最大值`对于给定列（第一列除外）多次，如本例所示：

    ```
    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)
    );
    ```

    在一个`价值低于`值列表必须与相应列的类型完全匹配；没有转换。例如，不能使用字符串`'1'`对于与使用整数类型的列匹配的值（必须使用数字`1.`你也不能用这个数字`1.`对于与使用字符串类型的列匹配的值（在这种情况下，必须使用带引号的字符串：`'1'`).

    有关更多信息，请参阅[第24.2.1节，“范围划分”](partitioning-range.html)和[第24.4节，“分区修剪”](partitioning-pruning.html).

-   `名单(*`expr`*)`

    这在基于表列分配分区时非常有用，该表列具有一组受限的可能值，例如州或国家代码。在这种情况下，与某个州或国家有关的所有行都可以分配给单个分区，或者分区可以保留给某个州或国家集。类似于`范围`，除了`价值观`可用于指定每个分区的允许值。

    `价值观`与要匹配的值列表一起使用。例如，您可以创建如下分区方案：

    ```
    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)
    );
    ```

    使用列表分区时，必须使用`价值观`.你不能使用`价值低于`具有`按列表分区`.

    笔记

    对于按分区的表`列表`，与一起使用的值列表`价值观`只能由整数值组成。在MySQL 8.0中，您可以通过使用`列`，这将在本节后面介绍。

-   `列(*`列列表`*)`

    这个变种`列表`有助于使用多列上的比较条件（即具有以下条件）对查询进行分区修剪：`其中a=5，b=5`或`其中a=1，b=10，c=5`)。它使您能够使用中的列列表在多个列中指定值`柱`子句和每个`隔断价值观(*`价值清单`*)`分区定义子句。

    管理中使用的列列表的数据类型的规则`列(*`列列表`*)`以及中使用的值列表`价值观(*`价值清单`*)`与中使用的列列表相同`范围列(*`列列表`*)`以及中使用的值列表`价值低于(*`价值清单`*)`，但`价值观`条款`最大值`是不允许的，您可以使用`无效的`.

    使用的值列表之间有一个重要的区别`价值观`具有`按列表列划分`而不是当它与`按列表分区`.与…一起使用时`按列表列划分`中的每个元素`价值观`子句必须是*设置*列值的定义；每个集合中的值数必须与集合中使用的列数相同`柱`子句，并且这些值的数据类型必须与列的数据类型匹配（并且以相同的顺序出现）。在最简单的情况下，集合由一列组成。中可以使用的最大列数*`列列表`*在构成这个世界的元素中*`价值清单`*她16岁。

    下表定义了`创建表格`语句提供了一个使用`列`分区：

    ```
    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) )
    );
    ```

-   `分区*`号码`*`

    分区的数量可以选择使用`分区*`号码`*`条款，在哪里*`号码`*是分区的数量。如果这两个条款*和*任何`隔断`使用子句，*`号码`*必须等于使用`隔断`条款。

    笔记

    无论你是否使用`分区`子句创建按分区的表`范围`或`列表`，您必须至少包含一个`分区值`表定义中的子句（见下文）。

-   `按`

    一个分区可以选择性地划分为若干个子分区。这可以通过使用可选的`按`条款可通过以下方式进行细分：`搞砸`或`钥匙`.这两个都可能是`线性的`。它们的工作方式与前面描述的等效分区类型相同。（不可能通过`列表`或`范围`.)

    子分区的数量可以使用`子分区`关键字后跟一个整数值。

-   严格检查中使用的值`分区`或`子分区`条款适用，该值必须遵守以下规则：

    -   该值必须是正的非零整数。

    -   不允许前导零。

    -   该值必须是整数文字，不能是表达式。例如`分区0.2E+01`但这是不允许的`0.2E+01`评估为`2.`（Bug#15890）

-   `*`分区定义`*`

    每个分区可以使用*`分区定义`*条款构成本条款的各个部分如下：

    -   `分割*`分区名称`*`

        指定分区的逻辑名称。

    -   `价值观`

        对于范围分区，每个分区必须包含一个`价值低于`条款对于列表分区，必须指定`价值观`每个分区的子句。这用于确定哪些行要存储在此分区中。请参阅中有关分区类型的讨论[第24章，*分割*](partitioning.html)，以获取语法示例。

    -   `[存储]引擎`

        MySQL接受`[存储]引擎`两者都有选择`隔断`和`子分区`.目前，使用此选项的唯一方法是将所有分区或所有子分区设置为同一个存储引擎，如果试图为同一个表中的分区或子分区设置不同的存储引擎，则会引发错误1469（HY000）：在这个版本的MySQL中，分区中不允许混合处理程序。

    -   `议论`

        可选的`议论`子句可用于指定描述分区的字符串。例子：

        ```
        COMMENT = 'Data for the years previous to 1999'
        ```

        分区注释的最大长度为1024个字符。

    -   `数据目录`和`索引目录`

        `数据目录`和`索引目录`可用于分别指示存储此分区的数据和索引的目录。两者`*`数据目录`*`还有`*`索引目录`*`必须是绝对系统路径名。

        从MySQL 8.0.21开始，在`数据目录`条款必须为所有人所知`InnoDB`。有关更多信息，请参阅[使用数据目录子句](innodb-create-table-external.html#innodb-create-table-external-data-directory).

        你一定有[`文件`](privileges-provided.html#priv_file)使用`数据目录`或`索引目录`分区选项。

        例子：

        ```
        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'
        );
        ```

        `数据目录`和`索引目录`以同样的方式行事[`创建表格`](create-table.html)声明*`表_选项`*子句用作`米萨姆`桌子。

        每个分区可以指定一个数据目录和一个索引目录。如果未指定，数据和索引默认存储在表的数据库目录中。

        这个`数据目录`和`索引目录`如果出现以下情况，则忽略创建分区表的选项：[`创建中没有目录`](sql-mode.html#sqlmode_no_dir_in_create)有效。

    -   `最大排数`和`MIN_ROWS`

        可用于分别指定分区中要存储的最大行数和最小行数。价值观*`最大行数`*和*`最小行数`*必须是正整数。与同名的表级选项一样，这些选项仅作为对服务器的“建议”，不是硬限制。

    -   `表空间`

        可用于指定`InnoDB`通过指定`表空间`innodb\_文件\_每个\_表``。所有分区必须属于同一个存储引擎。

        放置`InnoDB`共享内存中的表分区`InnoDB`不支持表空间。共享表空间包括`InnoDB`系统表空间和通用表空间。

-   `*`子分区定义`*`

    分区定义可以选择包含一个或多个分区*`子分区定义`*条款。每一个都至少包含`子分区*`名称`*`哪里*`名称`*是子分区的标识符。除了更换`隔断`关键字with`子分区`，子分区定义的语法与分区定义的语法相同。

    子分区必须由`搞砸`或`钥匙`，并且只能在`范围`或`列表`分区。看见[第24.2.6节“分段”](partitioning-subpartitions.html).

**按生成列进行分区**

允许按生成的列进行分区。例如：

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

分区将生成的列视为常规列，这可以解决分区不允许的函数的限制（请参阅[第24.6.3节，“与功能相关的分区限制”](partitioning-limitations-functions.html)).前面的示例演示了这种技术：[`EXP（）`](mathematical-functions.html#function_exp)不能直接用于`分割`子句，但使用[`EXP（）`](mathematical-functions.html#function_exp)是允许的。
