该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自动分配了序列号。除非NO_AUTO_VALUE_ON_ZERO
启用了SQL模式,否则还可以将0显式分配给该列以生成序列号 。例如:
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
序列。
您可以AUTO_INCREMENT
使用LAST_INSERT_ID()
SQL函数或mysql_insert_id()
C API函数检索最新自动生成的 值 。这些函数是特定于连接的,因此它们的返回值不受也执行插入操作的另一个连接的影响。
将最小的整数数据类型用于AUTO_INCREMENT
足够大的 列,以容纳所需的最大序列值。当列达到数据类型的上限时,下一次生成序列号的尝试将失败。UNSIGNED
如果可能,请使用该 属性以允许更大的范围。例如,如果使用 TINYINT
,则最大允许的序列号为127。对于TINYINT UNSIGNED
,最大的序列号为 255。有关的信息,请参见 第11.1.2节“整数类型(精确值)-INTEGER,INT,SMALLINT,TINYINT,MEDIUMINT,BIGINT”。所有整数类型的范围。
对于多行插入, LAST_INSERT_ID()
而 mysql_insert_id()
实际返回AUTO_INCREMENT
从钥匙 第一插入行的。这样可以在复制设置中的其他服务器上正确地复制多行插入。
要以AUTO_INCREMENT
非1 的值开头,请使用CREATE TABLE
或设置该值ALTER TABLE
,如下所示:
mysql> ALTER TABLE tbl AUTO_INCREMENT = 100;
有关AUTO_INCREMENT
特定于用法的信息InnoDB
,请参见 第15.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
属性分配给列:第13.1.20节“ CREATE TABLE语句”和 第13.1.9节“ ALTER TABLE语句”。 -
如何
AUTO_INCREMENT
依赖于的行为NO_AUTO_VALUE_ON_ZERO
SQL模式:第5.1.11,“SQL服务器模式”。 -
如何使用该
LAST_INSERT_ID()
函数查找包含最新AUTO_INCREMENT
值的行 : 第12.16节“信息函数”。 -
设置
AUTO_INCREMENT
要使用的值:第5.1.8节“服务器系统变量”。 -
AUTO_INCREMENT
和复制: 第17.5.1.1节“复制和AUTO_INCREMENT”。 -
与
AUTO_INCREMENT
(auto_increment_increment
和auto_increment_offset
)有关的服务器系统变量 可用于复制: 第5.1.8节“服务器系统变量”。