相关文档 下载本手册
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 参考手册  /  ...  /  使用 AUTO_INCREMENT

5.6.9 使用 AUTO_INCREMENT

可以使用 AUTO_INCREMENT 属性为新行生成唯一标识

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;

返回

+----+---------+
| id | name    |
+----+---------+
|  1 | dog     |
|  2 | cat     |
|  3 | penguin |
|  4 | lax     |
|  5 | whale   |
|  6 | ostrich |
+----+---------+

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

INSERT INTO animals (id,name) VALUES(0,'groundhog');

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

INSERT INTO animals (id,name) VALUES(NULL,'squirrel');

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

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 设置该值,如下所示

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。当您想要将数据放入有序组中时,这很有用。

    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;

    返回

    +--------+----+---------+
    | 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 的更多信息,请参见以下内容