相關文件 下載本手冊
PDF (美式信紙) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  使用 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 注意事項

有關 InnoDB 特定的 AUTO_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 的更多資訊,請參閱以下內容