http://docs.oracle.com/cd/E17952_01/refman-5.5-en/example-auto-increment.html
3.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;
Which returns:
+
| id | name |
+
| 1 | dog |
| 2 | cat |
| 3 | penguin |
| 4 | lax |
| 5 | whale |
| 6 | ostrich |
+
未指定AUTO_INCREMENT列的值,因此MySQL会自动分配序列号。您也可以显式将NULL或0分配给该列,以生成序列号。
使用LAST_INSERT_ID() SQL函数或mysql_insert_id() C API函数检索最近的AUTO_INCREMENT值。这些函数是连接特定的,因此它们的返回值不受同时执行插入操作的另一个连接的影响。
为AUTO_INCREMENT列使用足够大的最小整数数据类型,以容纳所需的最大序列值。当该列达到数据类型的上限时,下一个尝试生成序列号将失败。如果可能,请使用UNSIGNED属性以允许更大的范围。例如,如果使用TINYINT,则最大允许的序列号为127。对于TINYINT UNSIGNED,最大值为255。有关所有整数类型范围的信息,请参见第11.2.1节“整数类型(精确值) - INTEGER、INT、SMALLINT、TINYINT、MEDIUMINT、BIGINT”。
对于多行插入,LAST_INSERT_ID()和mysql_insert_id()实际上返回插入行中第一个的AUTO_INCREMENT键。这使得可以在复制设置中正确重现多行插入。
如果AUTO_INCREMENT列是多个索引的一部分,则MySQL使用以AUTO_INCREMENT列开头的索引生成序列值(如果存在)。例如,如果animals表包含PRIMARY KEY(grp,id)和INDEX(id)索引,则MySQL将忽略PRIMARY KEY以生成序列值。因此,该表将包含单个序列,而不是每个grp值的序列。
要以1之外的AUTO_INCREMENT值开始,请使用CREATE TABLE或ALTER TABLE设置该值,例如:
mysql> ALTER TABLE tbl AUTO_INCREMENT = 100;
InnoDB注意事项
对于InnoDB表,在INSERT语句序列的中间修改包含自增值的列时要小心。例如,如果使用UPDATE语句在自增列中放置一个新的、较大的值,后续的INSERT可能会遇到“重复条目”错误。是否存在自增值的测试发生在执行DELETE后跟更多的INSERT语句,或者在提交事务之后,但不是在UPDATE语句之后。
MyISAM注意事项
对于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;
Which returns:
+
| 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值。即使对于通常不重用AUTO_INCREMENT值的MyISAM表也是如此。
进一步阅读:
有关AUTO_INCREMENT的更多信息,请参见此处:
如何将AUTO_INCREMENT属性分配给列:第13.1.17节“CREATE TABLE Syntax”和第13.1.7节“ALTER TABLE Syntax”。
根据NO_AUTO_VALUE_ON_ZERO SQL模式,AUTO_INCREMENT的行为如何变化:第5.1.7节“服务器SQL模式”。
如何使用LAST_INSERT_ID()函数查找包含最新AUTO_INCREMENT值的行:第12.14节“信息函数”。
设置要使用的AUTO_INCREMENT值:第5.1.4节“服务器系统变量”。
与AUTO_INCREMENT相关的服务器系统变量(auto_increment_increment和auto_increment_offset)可用于复制:第5.1.4节“服务器系统变量”。
http://search.oracle.com/search/search?q=auto_increment&group=Documentation&x=0&y=0