Using AUTO_INCREMENT
AUTO_INCREMENT属性可以用来为新记录生成唯一的标识符:
mysql> CREATE TABLE animals(
-> id mediumint not null auto_increment,
-> name char(30) not null,
-> primary key (id)
-> );
Query OK, 0 rows affected (0.01 sec)
mysql> 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模式被激活。如果该列被声明为NOT NULL,也可以赋值给该列NULL来获得自动增加的值。当你插入任何其他值到AUTO_INCREMENT列时,自动增长的值会被重置为该列最大的值
你可以提取最近生成的AUTO_INCREMENT值通过LAST_INSERT_ID() SQL函数或 mysql_insert_id() C API函数。这些函数都是连接特定的,因此他们的返回值不受其他也执行了插入操作的连接影响。
使用最小的整数数据类型对于AUTO_INCREMENT列就已经足够。当该列到达数据类型最大的限制时,下次尝试生成自增值会失败。使用UNSIGNED属性如果可以的话来生成更大一点的范围。例如,你使用TINYINT,最大可能到达的值是127。对于TINYINT UNSIGNED,最小值可能是255 查看 Section 11.2.1, “Integer Types (Exact Value) - INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT” 获取各种整形类型的范围
mysql> insert into animals values (0, "a");
mysql> select * from animals;
+----+---------+
| id | name |
+----+---------+
| 1 | dog |
| 2 | cat |
| 3 | penguin |
| 4 | lax |
| 5 | whale |
| 6 | ostrich |
| 7 | a |
+----+---------+
注:
对于同时插入一行,LAST_INSERT_ID()和mysql_insert_id()真正返回的AUTO_INCREMENT值是最先插入的一行。This enables multiple-row inserts to be reproduced correctly on other servers in a replication setup.
让AUTO_INCREMENT值不是以1开始,用CREATE TABLE或ALTER TABLE语句,像这样
mysql> alter table animals AUTO_INCREMENT=8;
INNODB Notes
获取关于AUTO_INCREMENT在InnoDB中特殊的使用事项,查看Section 14.8.1.5, “AUTO_INCREMENT Handling in InnoDB”.
MyISAM Notes
- 对于MyISAM表,你可以在联合索引的第二列指定AUTO_INCREMENT。在这种情况下对于AUTO_INCREMENT列生成的值是MAX(auto_increment_column) + 1 WHERE prefix = given-prefix.这在你把数据放入排序组是非常有用的。
mysql> 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;
Query OK, 0 rows affected (0.02 sec)
mysql>
mysql> INSERT INTO animals (grp,name) VALUES
-> ('mammal','dog'),('mammal','cat'),
-> ('bird','penguin'),('fish','lax'),('mammal','whale'),
-> ('bird','ostrich');
Query OK, 6 rows affected (0.00 sec)
Records: 6 Duplicates: 0 Warnings: 0
mysql> 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 |
+--------+----+---------+
6 rows in set (0.00 sec)
mysql>