Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 Reference Manual  /  ...  /  Creating InnoDB Tables

17.6.1.1 创建 InnoDB 表

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

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

不需要在 ENGINE=InnoDB 子句中指定 InnoDB,因为 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节,“Tablespaces”

InnoDB 表的行格式确定了其行在磁盘上的物理存储方式。InnoDB 支持四种行格式,每种格式都具有不同的存储特征。支持的行格式包括 REDUNDANTCOMPACTDYNAMICCOMPRESSED。默认的行格式是 DYNAMIC。关于行格式特征的信息,请见第17.10节,“InnoDB Row Formats”

变量innodb_default_row_format确定了默认行格式。表的行格式也可以在CREATE TABLEALTER TABLE 语句中使用 ROW_FORMAT 表选项。更多信息,请见Defining the Row Format of a Table

建议您为每个表定义一个主键。选择主键列时,请选择以下特征:

  • 被最重要查询引用列。

  • 从不为空的列。

  • 从不出现重复值的列。

  • 从不更改值的列。

例如,在包含人信息的表中,你不能创建一个主键在(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表的属性,可以执行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信息Schema系统表来访问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 Schema Object Tables”