相關文件 下載本手冊
PDF (美國信紙尺寸) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  使用 AUTO_INCREMENT

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 鍵。這使得多列插入能夠在複製設定中的其他伺服器上正確地重製。

若要從 1 以外的 AUTO_INCREMENT 值開始,請使用 CREATE TABLEALTER TABLE 來設定該值,如下所示

mysql> ALTER TABLE tbl AUTO_INCREMENT = 100;

InnoDB 附註

有關特定於 InnoDBAUTO_INCREMENT 使用資訊,請參閱 第 17.6.1.6 節,「InnoDB 中的 AUTO_INCREMENT 處理」

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;

    回傳

    +--------+----+---------+
    | 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 的更多資訊,請參閱此處