MySQL教程/常见查询的例子/使用AUTO_INCREMENT

7.9使用AUTO_INCREMENT

AUTO_INCREMENT属性可用于为新行生成唯一标识:

CREATE TABLE animals (id MEDIUMINT NOT NULL AUTO_INCREMENT, name CHAR(30) NOT NULL, PRIMARY KEY (id));插入动物(名字)值(“狗”)(“猫”)(“企鹅”)(“宽松”)(“鲸鱼”)(“鸵鸟”);SELECT * FROM animals;

返回:

+----+---------+ | id |名称  | +----+---------+ | 猫狗1 | | | 2 | | | 3 |企鹅| | 4 |松懈| | 5 |鲸鱼| | 6 |鸵鸟  | +----+---------+

对象没有指定值AUTO_INCREMENT列,因此MySQL自动分配序列号。也可以显式地将0赋给列以生成序列号,除非NO_AUTO_VALUE_ON_ZERO启用SQL模式。例如:

INSERT INTO animals (id,name) VALUES(0,'groundhog');

如果声明了列非空,也可以赋值以生成序列号。例如:

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 |名称  | +-----+-----------+ | 猫狗1 | | | 2 | | | 3 |企鹅| | 4 |松懈| | 5 |鲸鱼| | 6 |鸵鸟| | 7 |土拨鼠| | 8 |松鼠| | 100 | |兔子| 101 |鼠标  | +-----+-----------+

更新现有的AUTO_INCREMENT的值也将重置AUTO_INCREMENT序列。

您可以检索最近自动生成的AUTO_INCREMENT的值LAST_INSERT_ID ()SQL函数或mysql_insert_id ()C API函数。这些函数是特定于连接的,因此它们的返回值不受同样执行插入的另一个连接的影响。

类使用最小的整数数据类型AUTO_INCREMENT列,其大小足以容纳所需的最大序列值。当列达到数据类型的上限时,下次生成序列号的尝试将失败。使用无符号属性允许更大的范围。例如,如果你使用非常小的整数,最大允许序号为127。为非常小的整数无符号,最大值为255。看到整数类型(精确值)- Integer, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT所有整数类型的范围。

请注意

对于多行插入,LAST_INSERT_ID ()而且mysql_insert_id ()返回AUTO_INCREMENT钥匙从第一个插入的行。这允许在复制设置中在其他服务器上正确复制多行插入。

从…开始AUTO_INCREMENT值不是1,设置该值为创建表ALTER TABLE,像这样:

修改表AUTO_INCREMENT = 100;

InnoDB的笔记

有关AUTO_INCREMENT特定于InnoDB,请参阅InnoDB中的AUTO_INCREMENT处理

MyISAM笔记

  • MyISAM表,您可以指定AUTO_INCREMENT在多列索引的辅助列上。在本例中,生成的值AUTO_INCREMENT列计算为MAX (auto_increment_column) + 1 WHERE prefix=given-prefix.当您希望将数据放入有序组中时,这非常有用。

    CREATE TABLE animals (grp ENUM('fish','哺乳动物','鸟类')NOT NULL, id MEDIUMINT NOT NULL AUTO_INCREMENT, name CHAR(30) NOT NULL, PRIMARY KEY (grp,id)) ENGINE=MyISAM;插入动物(grp)值(“哺乳动物”,“狗”)(“哺乳动物”,“猫”)(“鸟”,“企鹅”)(“鱼”,“宽松”)(“哺乳动物”,“鲸鱼”)(“鸟”,“鸵鸟”);SELECT * FROM animals ORDER BY grp,id;

    返回:

    +--------+----+---------+ | grp | | id名称  | +--------+----+---------+ | 哺乳动物鱼| 1 |松懈| | | 1 |狗| |哺乳动物猫| 2 | | | | 3 |鲸鱼哺乳动物| |鸟| 1 |企鹅| | | 2 |的鸵鸟  | +--------+----+---------+

    在这种情况下(当AUTO_INCREMENT列是多列索引的一部分),AUTO_INCREMENT如果删除最大的行,则值将被重用AUTO_INCREMENT任何组的值。这甚至发生在MyISAM表,用于AUTO_INCREMENT值通常不会被重用。

  • 如果AUTO_INCREMENT列是多个索引的一部分,MySQL使用以AUTO_INCREMENT列,如果有的话。例如,如果动物表包含索引主键:grp, id而且指数(id), MySQL将忽略主键用于生成序列值。因此,该表将包含单个序列,而不是每个序列grp价值。

进一步的阅读

更多关于AUTO_INCREMENT可在此下载: