可以使用 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 TABLE
或 ALTER TABLE
设置该值,如下所示
mysql> ALTER TABLE tbl AUTO_INCREMENT = 100;
有关特定于 InnoDB
的 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;
返回
+--------+----+---------+ | 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
的更多信息,请参见以下内容
如何将
AUTO_INCREMENT
属性分配给列:第 15.1.20 节,“CREATE TABLE 语句”,以及 第 15.1.9 节,“ALTER TABLE 语句”。根据
NO_AUTO_VALUE_ON_ZERO
SQL 模式,AUTO_INCREMENT
的行为方式:第 7.1.11 节,“服务器 SQL 模式”。如何使用
LAST_INSERT_ID()
函数查找包含最新AUTO_INCREMENT
值的行:第 14.15 节,“信息函数”。设置要使用的
AUTO_INCREMENT
值:第 7.1.8 节,“服务器系统变量”。AUTO_INCREMENT
和复制:第 19.5.1.1 节,“复制和 AUTO_INCREMENT”。与
AUTO_INCREMENT
相关的服务器系统变量(auto_increment_increment
和auto_increment_offset
),可用于复制:第 7.1.8 节,“服务器系统变量”。