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  /  ...  /  Using 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 NULLNULL以生成序列号。例如:

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”,了解所有整数类型的范围。

Note

对于多行插入,LAST_INSERT_ID()mysql_insert_id() 实际返回 AUTO_INCREMENT 键来自插入的第一个行。这使得多行插入在复制设置中可以正确地重现。

使用其他值开始一个AUTO_INCREMENT值,使用CREATE TABLEALTER TABLE,例如:

mysql> ALTER TABLE tbl AUTO_INCREMENT = 100;

关于AUTO_INCREMENT的特定信息,见第17.6.1.6节,“InnoDB 中的 AUTO_INCREMENT 处理”

  • 对于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;

    在这种情况下(当AUTO_INCREMENT列是多列索引的一部分),AUTO_INCREMENT值会被重新使用,如果你删除了任何组中的最大AUTO_INCREMENT值的行。这也适用于MyISAM表,通常情况下AUTO_INCREMENT值不会被重新使用。

    +--------+----+---------+
    | 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的更多信息可在这里找到: