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 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
键来自插入的第一个行。这使得多行插入在复制设置中可以正确地重现。
使用其他值开始一个AUTO_INCREMENT
值,使用CREATE TABLE
或ALTER 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
的更多信息可在这里找到:
-
将
AUTO_INCREMENT
属性分配给列:第15.1.20节,“CREATE TABLE 语句”,和第15.1.9节,“ALTER TABLE 语句”。 -
AUTO_INCREMENT
在NO_AUTO_VALUE_ON_ZERO
SQL 模式下如何行为:第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节,“服务器系统变量”。