#### 15.6.1.1 创建 InnoDB 表

[](<>)

`InnoDB`表是使用[`创建表`](create-table.html)陈述;例如：

```
CREATE TABLE t1 (a INT, b CHAR (20), PRIMARY KEY (a)) ENGINE=InnoDB;
```

这`引擎=InnoDB`子句不需要时`InnoDB`被定义为默认的存储引擎，它是默认的。然而`引擎`子句很有用，如果[`创建表`](create-table.html)语句将在没有默认存储引擎的不同 MySQL 服务器实例上重播`InnoDB`或者是未知的。您可以通过发出以下语句来确定 MySQL 服务器实例上的默认存储引擎：

```
mysql> SELECT @@default_storage_engine;
+--------------------------+
| @@default_storage_engine |
+--------------------------+
| InnoDB                   |
+--------------------------+
```

`InnoDB`默认情况下，表是在 file-per-table 表空间中创建的。创建一个`InnoDB`表中的`InnoDB`系统表空间，禁用[`innodb_file_per_table`](innodb-parameters.html#sysvar_innodb_file_per_table)创建表之前的变量。创建一个`InnoDB`通用表空间中的表，使用[`创建表...表空间`](create-table.html)句法。有关详细信息，请参阅[第 15.6.3 节，“表空间”](innodb-tablespace.html).

##### 行格式

[](<>)

的行格式`InnoDB`table 确定其行在磁盘上的物理存储方式。`InnoDB`支持四种行格式，每种都有不同的存储特性。支持的行格式包括`多余的`,`袖珍的`,`动态的`， 和`压缩`.这`动态的`行格式是默认值。有关行格式特征的信息，请参阅[第 15.10 节，“InnoDB 行格式”](innodb-row-format.html).

这[`innodb_default_row_format`](innodb-parameters.html#sysvar_innodb_default_row_format)变量定义默认行格式。表的行格式也可以使用显式定义`ROW_FORMAT`a中的表选项`创建表`要么`更改表`陈述。看[定义表格的行格式](innodb-row-format.html#innodb-row-format-defining).

##### 主键

[](<>)

建议您为创建的每个表定义一个主键。选择主键列时，选择具有以下特征的列：

-   最重要的查询引用的列。

-   永远不会留空的列。

-   从不具有重复值的列。

-   插入后很少更改值的列。

    例如，在包含人员信息的表中，您不会在`（名字，姓氏）`因为不止一个人可以有相同的名字，名字栏可能会留空，有时人们会改变他们的名字。由于有如此多的约束，通常没有一组明显的列可用作主键，因此您创建一个具有数字 ID 的新列作为主键的全部或部分。你可以声明一个[自动递增](glossary.html#glos_auto_increment)列，以便在插入行时自动填充升序值：


```
# The value of ID can act like a pointer between related items in different tables.
CREATE TABLE t5 (id INT AUTO_INCREMENT, b CHAR (20), PRIMARY KEY (id));

# The primary key can consist of more than one column. Any autoinc column must come first.
CREATE TABLE t6 (id INT AUTO_INCREMENT, a INT, b CHAR (20), PRIMARY KEY (id,a));
```

有关自动递增列的更多信息，请参阅[第 15.6.1.6 节，“自动\_InnoDB 中的增量处理”](innodb-auto-increment-handling.html).

尽管表在不定义主键的情况下也能正常工作，但主键涉及性能的许多方面，并且对于任何大型或经常使用的表来说都是至关重要的设计方面。建议您始终在[`创建表`](create-table.html)陈述。如果创建表，加载数据，然后运行[`更改表`](alter-table.html)稍后添加主键，该操作比创建表时定义主键要慢得多。有关主键的更多信息，请参阅[第 15.6.2.1 节，“聚集索引和二级索引”](innodb-index-types.html).

##### 查看 InnoDB 表属性

[](<>)

查看一个属性`InnoDB`表，发出一个[`显示表状态`](show-table-status.html)陈述：

```
mysql> SHOW TABLE STATUS FROM test LIKE 't%' \G;
*************************** 1. row ***************************
           Name: t1
         Engine: InnoDB
        Version: 10
     Row_format: Dynamic
           Rows: 0
 Avg_row_length: 0
    Data_length: 16384
Max_data_length: 0
   Index_length: 0
      Data_free: 0
 Auto_increment: NULL
    Create_time: 2021-02-18 12:18:28
    Update_time: NULL
     Check_time: NULL
      Collation: utf8mb4_0900_ai_ci
       Checksum: NULL
 Create_options:
        Comment:
```

有关信息[`显示表状态`](show-table-status.html)输出，见[第 13.7.7.38 节，“SHOW TABLE STATUS 语句”](show-table-status.html).

您还可以访问`InnoDB`通过查询表属性`InnoDB`信息模式系统表：

```
mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_TABLES WHERE NAME='test/t1' \G
*************************** 1. row ***************************
     TABLE_ID: 1144
         NAME: test/t1
         FLAG: 33
       N_COLS: 5
        SPACE: 30
   ROW_FORMAT: Dynamic
ZIP_PAGE_SIZE: 0
   SPACE_TYPE: Single
 INSTANT_COLS: 0
```

有关详细信息，请参阅[第 15.15.3 节，“InnoDB 信息\_SCHEMA 模式对象表”](innodb-information-schema-system-tables.html).
