MySQL 9.0 参考手册  /  ...  /  使用 AUTO_INCREMENT

5.6.9 使用 AUTO_INCREMENT

AUTO_INCREMENT 属性可用于为新行生成唯一的标识

Press CTRL+C to copy
CREATE TABLE animals ( id MEDIUMINT NOT NULL AUTO_INCREMENT, name CHAR(30) NOT NULL, PRIMARY KEY (id) ); INSERT INTO animals (name) VALUES ('dog'),('cat'),('penguin'), ('lax'),('whale'),('ostrich'); SELECT * FROM animals;

返回

Press CTRL+C to copy
+----+---------+ | id | name | +----+---------+ | 1 | dog | | 2 | cat | | 3 | penguin | | 4 | lax | | 5 | whale | | 6 | ostrich | +----+---------+

没有为 AUTO_INCREMENT 列指定值,因此 MySQL 自动分配了序列号。您也可以显式地将 0 分配给该列以生成序列号,除非启用了 NO_AUTO_VALUE_ON_ZERO SQL 模式。例如

Press CTRL+C to copy
INSERT INTO animals (id,name) VALUES(0,'groundhog');

如果该列被声明为 NOT NULL,则也可以将 NULL 分配给该列以生成序列号。例如

Press CTRL+C to copy
INSERT INTO animals (id,name) VALUES(NULL,'squirrel');

当您将任何其他值插入 AUTO_INCREMENT 列时,该列将设置为该值,并且序列将重置,以便下一个自动生成的值按顺序从最大的列值开始。例如

Press CTRL+C to copy
INSERT INTO animals (id,name) VALUES(100,'rabbit'); INSERT INTO animals (id,name) VALUES(NULL,'mouse'); SELECT * FROM animals; +-----+-----------+ | id | name | +-----+-----------+ | 1 | dog | | 2 | cat | | 3 | penguin | | 4 | lax | | 5 | whale | | 6 | ostrich | | 7 | groundhog | | 8 | squirrel | | 100 | rabbit | | 101 | mouse | +-----+-----------+

更新现有的 AUTO_INCREMENT 列值也会重置 AUTO_INCREMENT 序列。

您可以使用 LAST_INSERT_ID() SQL 函数或 mysql_insert_id() C API 函数检索最近自动生成的 AUTO_INCREMENT 值。这些函数是特定于连接的,因此它们的返回值不受也执行插入操作的另一个连接的影响。

AUTO_INCREMENT 列使用足以容纳所需最大序列值的最小整数数据类型。当列达到数据类型的上限时,下一次生成序列号的尝试将失败。如果可能,请使用 UNSIGNED 属性以允许更大的范围。例如,如果您使用 TINYINT,则允许的最大序列号为 127。对于 TINYINT UNSIGNED,最大值为 255。有关所有整数类型的范围,请参见 第 13.1.2 节“整数类型(精确值)- INTEGER、INT、SMALLINT、TINYINT、MEDIUMINT、BIGINT”

注意

对于多行插入,LAST_INSERT_ID()mysql_insert_id() 实际上返回插入的第 一行AUTO_INCREMENT 键。这使得多行插入能够在复制设置中的其他服务器上正确复制。

要从 1 以外的 AUTO_INCREMENT 值开始,请使用 CREATE TABLEALTER TABLE 设置该值,如下所示

Press CTRL+C to copy
mysql> ALTER TABLE tbl AUTO_INCREMENT = 100;

InnoDB 说明

有关特定于 InnoDBAUTO_INCREMENT 使用的信息,请参见 第 17.6.1.6 节“InnoDB 中的 AUTO_INCREMENT 处理”

MyISAM 说明

  • 对于 MyISAM 表,您可以在多列索引的辅助列上指定 AUTO_INCREMENT。在这种情况下,AUTO_INCREMENT 列的生成值为 MAX(auto_increment_column) + 1 WHERE prefix=given-prefix。当您想将数据放入有序组时,这很有用。

    Press CTRL+C to copy
    CREATE TABLE animals ( grp ENUM('fish','mammal','bird') NOT NULL, id MEDIUMINT NOT NULL AUTO_INCREMENT, name CHAR(30) NOT NULL, PRIMARY KEY (grp,id) ) ENGINE=MyISAM; INSERT INTO animals (grp,name) VALUES ('mammal','dog'),('mammal','cat'), ('bird','penguin'),('fish','lax'),('mammal','whale'), ('bird','ostrich'); SELECT * FROM animals ORDER BY grp,id;

    返回

    Press CTRL+C to copy
    +--------+----+---------+ | grp | id | name | +--------+----+---------+ | fish | 1 | lax | | mammal | 1 | dog | | mammal | 2 | cat | | mammal | 3 | whale | | bird | 1 | penguin | | bird | 2 | ostrich | +--------+----+---------+

    在这种情况下(当 AUTO_INCREMENT 列是多列索引的一部分时),如果您删除任何组中具有最大 AUTO_INCREMENT 值的行,则 AUTO_INCREMENT 值将被重用。即使对于 MyISAM 表(通常不会重用其 AUTO_INCREMENT 值),也会发生这种情况。

  • 如果 AUTO_INCREMENT 列是多个索引的一部分,则 MySQL 使用以 AUTO_INCREMENT 列开头的索引(如果有)生成序列值。例如,如果 animals 表包含索引 PRIMARY KEY (grp, id)INDEX (id),则 MySQL 将忽略 PRIMARY KEY 来生成序列值。结果,该表将包含一个序列,而不是每个 grp 值一个序列。

延伸阅读

有关 AUTO_INCREMENT 的更多信息,请参见此处