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

  1. CREATE TABLE animals (
  2. id MEDIUMINT NOT NULL AUTO_INCREMENT,
  3. name CHAR(30) NOT NULL,
  4. PRIMARY KEY (id)
  5. );
  6. INSERT INTO animals (name) VALUES
  7. ('dog'),('cat'),('penguin'),
  8. ('lax'),('whale'),('ostrich');
  9. SELECT * FROM animals;

返回:

  1. +----+---------+
  2. | id | name |
  3. +----+---------+
  4. | 1 | dog |
  5. | 2 | cat |
  6. | 3 | penguin |
  7. | 4 | lax |
  8. | 5 | whale |
  9. | 6 | ostrich |
  10. +----+---------+

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

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

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

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

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

  1. INSERT INTO animals (id,name) VALUES(100,'rabbit');
  2. INSERT INTO animals (id,name) VALUES(NULL,'mouse');
  3. SELECT * FROM animals;
  4. +-----+-----------+
  5. | id | name |
  6. +-----+-----------+
  7. | 1 | dog |
  8. | 2 | cat |
  9. | 3 | penguin |
  10. | 4 | lax |
  11. | 5 | whale |
  12. | 6 | ostrich |
  13. | 7 | groundhog |
  14. | 8 | squirrel |
  15. | 100 | rabbit |
  16. | 101 | mouse |
  17. +-----+-----------+

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

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

对 AUTO_INCREMENT 列使用最小的整数数据类型,该数据类型大到足以容纳您需要的最大序列值。当列达到数据类型的上限时,下一次生成序列号的尝试失败。如果可能,请使用 UNSIGNED 属性以允许更大的范围。例如,如果您使用 TINYINT,则允许的最大序列号为 127。对于 TINYINT UNSIGNED,最大值为 255。

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

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

  1. mysql> ALTER TABLE tbl AUTO_INCREMENT = 100;

MyISAM Note

  • 对于 MyISAM 表,您可以在多列索引中的辅助列上指定 AUTO_INCREMENT。在这种情况下,AUTO_INCREMENT 列的生成值计算为 MAX(auto_increment_column) + 1 WHERE prefix=given-prefix。当您要将数据放入有序组时,这很有用。 ```sql 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;

  1. 返回:
  2. ```sql
  3. +--------+----+---------+
  4. | grp | id | name |
  5. +--------+----+---------+
  6. | fish | 1 | lax |
  7. | mammal | 1 | dog |
  8. | mammal | 2 | cat |
  9. | mammal | 3 | whale |
  10. | bird | 1 | penguin |
  11. | bird | 2 | ostrich |
  12. +--------+----+---------+

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

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