mysql 属性 auto_increment

237 阅读2分钟

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 最新自动生成的值。这些函数是 connection-specific 的,因此它们的返回值不受另一个执行插入操作的连接影响。

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

注意
对于多行插入,LAST_INSERT_ID() 和 mysql_insert_id() 实际返回从第一行开始的 AUTO_INCREMENT 值。这使得在多个服务器上执行多行插入可以正确执行。

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

ALTER TABLE tbl AUTO_INCREMENT = 100;