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
索引鍵。這可讓多資料列插入在複寫設定中的其他伺服器上正確重現。
若要以 1 以外的 AUTO_INCREMENT
值開始,請使用 CREATE TABLE
或 ALTER TABLE
設定該值,如下所示
mysql> ALTER TABLE tbl AUTO_INCREMENT = 100;
有關 InnoDB
特定的 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;
這會傳回
+--------+----+---------+ | 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
欄位是多個索引的一部分,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 節,「伺服器系統變數」。