HOWTO · MySQL

在 MySQL 中重置自動增量

本教程演示瞭如何在 MySQL 中重置自動增量。

本頁內容

本教學說明如何重設 MySQL AUTO_INCREMENT 欄位接下來產生的值。使用 ALTER TABLE 指定新的起始值。這項設定只影響之後新增的資料列,不會變更表中已儲存的 ID。

MySQL 的 AUTO_INCREMENT 運作方式

插入資料列時,如果省略 AUTO_INCREMENT 欄位的值,該欄位就會自動提供識別碼。這種欄位常用作資料表的主鍵。MySQL 會追蹤資料表接下來要產生的值;除非明確執行更新,否則既有資料列不會改變。

建立並檢視 AUTO_INCREMENT 資料表

以下陳述式會建立一個資料表、加入五筆資料,並檢視 MySQL 指派的 ID。請在同一個 MySQL 資料庫工作階段中執行,或確保各陳述式使用相同的資料庫。每次插入時都省略 id 欄位,讓 MySQL 自動產生其值。

使用 CREATE TABLE students (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, first_name VARCHAR(255), enrolled_on DATE); 建立資料表。使用 INSERT INTO students (first_name, enrolled_on) VALUES ('Preet', '2005-05-24'), ('Dhruv', '2001-06-14'), ('Mathew', '2020-12-13'), ('Jeet', '2003-05-14'), ('Steyn', '2002-07-19'); 加入範例資料列。接著用 SELECT id, first_name, enrolled_on FROM students ORDER BY id; 檢視資料。對於沒有既有資料列的新資料表,MySQL 會依插入順序產生 1 到 5 的 ID。

重設下一個 AUTO_INCREMENT 值

使用以下語法,並將資料表名稱和數字換成自己的值:ALTER TABLE table_name AUTO_INCREMENT = value;。以 students 資料表為例,ALTER TABLE students AUTO_INCREMENT = 100; 會要求下一個產生的 ID 為 100。ALTER TABLE 會變更資料表的計數器,但不會改寫任何既有的 id 值。

以上述資料列為例,以下簡短的 Python 模型會示範要求值 100 與目前最大值的比較方式。這只是用來說明規則的模型,不會連線至 MySQL。

本節中的程式碼以及顯示的標籤或輸出仍為英文。

current_max_id = 5
requested_next_id = 100
next_id = max(current_max_id + 1, requested_next_id)
print(next_id)

程式碼區塊中的識別字保留英文;範例輸出為 100,這是 Python 模型的結果,不是 MySQL 查詢結果。

100

確認下一個產生的值

ALTER TABLE 陳述式成功執行後,請在不指定 id 的情況下插入一筆資料:INSERT INTO students (first_name, enrolled_on) VALUES ('Rutvik', '2001-01-16');。接著執行 SELECT id, first_name, enrolled_on FROM students WHERE first_name = 'Rutvik'; 檢查結果。若資料表狀態如上,且要求值為 100,新資料列的 ID 應為 100。請在 MySQL 中執行這些 SQL 陳述式,以確認實際資料表的結果;上方的 Python 示範不是資料庫查詢。

重設 AUTO_INCREMENT 時的重要限制

MySQL 不會產生小於目前最大 id 加一的值。如果資料表已有 ID 120,要求值 100 並不會取代或重新編號該資料列;下一個產生的 ID 至少會是 121。若要從 1 重新開始,資料表必須為空;只要仍有任何資料列(包括 ID 為 1 的資料列),就無法從 1 重新開始。只有在符合預期且對應用程式安全時,才移除會限制計數器的資料列;也要考量相關資料列或外鍵限制。

例如載入受控資料集後,如果需要為之後新增的資料列指定起始值,重設計數器就很有用。它不能用來填補刪除資料列留下的空號、變更既有主鍵,或在下一次插入前可能發生並行寫入或其他插入的情況下,保證取得特定 ID。如果確實需要指定某個識別碼,請先確認結構描述和應用程式允許明確指定,並檢查是否有衝突。將計數器設定、插入資料和確認查詢一併執行,才能確認新產生的值指派給哪筆資料。