文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  创建 InnoDB 表

17.6.1.1 创建 InnoDB 表

InnoDB 表使用 CREATE TABLE 语句创建;例如

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

InnoDB 被定义为默认存储引擎时,ENGINE=InnoDB 子句不是必需的,它默认情况下就是默认存储引擎。但是,如果 CREATE TABLE 语句要在默认存储引擎不是 InnoDB 或未知的其他 MySQL 服务器实例上重放,则 ENGINE 子句很有用。您可以通过发出以下语句来确定 MySQL 服务器实例上的默认存储引擎

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

InnoDB 表默认创建在每个表一个文件表空间中。要在 InnoDB 系统表空间中创建 InnoDB 表,请在创建表之前禁用 innodb_file_per_table 变量。要在通用表空间中创建 InnoDB 表,请使用 CREATE TABLE ... TABLESPACE 语法。有关更多信息,请参见 第 17.6.3 节“表空间”

行格式

InnoDB 表的行格式决定了它的行如何在磁盘上物理存储。InnoDB 支持四种行格式,每种格式都有不同的存储特性。支持的行格式包括 REDUNDANTCOMPACTDYNAMICCOMPRESSEDDYNAMIC 行格式是默认格式。有关行格式特性的信息,请参见 第 17.10 节“InnoDB 行格式”

innodb_default_row_format 变量定义默认行格式。表的行格式也可以使用 CREATE TABLEALTER TABLE 语句中的 ROW_FORMAT 表选项显式定义。请参见 定义表的行格式

主键

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

  • 被最重要的查询引用的列。

  • 永远不会留空的列。

  • 永远不会有重复值的列。

  • 插入后很少改变值的列。

例如,在一个包含有关人员信息的表中,您不会在 (firstname, lastname) 上创建主键,因为不止一个人可以有相同的姓名,姓名列可能会留空,有时人们会改名。由于有这么多的约束,通常没有一组明显的列可作为主键,因此您创建一个新的数字 ID 列作为主键的全部或部分。您可以声明一个 自动递增 列,以便在插入行时自动填充递增值

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

有关自动递增列的更多信息,请参见 第 17.6.1.6 节“InnoDB 中的 AUTO_INCREMENT 处理”

虽然没有定义主键,表也能正常工作,但主键涉及许多性能方面,并且是任何大型或频繁使用表的关键设计方面。建议您始终在 CREATE TABLE 语句中指定主键。如果您创建了表、加载了数据,然后运行 ALTER TABLE 在之后添加主键,该操作比在创建表时定义主键要慢得多。有关主键的更多信息,请参见 第 17.6.2.1 节,“聚簇索引和辅助索引”

查看 InnoDB 表属性

要查看 InnoDB 表的属性,请发出 SHOW TABLE STATUS 语句

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 输出的信息,请参见 第 15.7.7.37 节,“SHOW TABLE STATUS 语句”

您也可以通过查询 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

有关更多信息,请参见 第 17.15.3 节,“InnoDB INFORMATION_SCHEMA 架构对象表”