MySQL 表的主鍵一般都要使用自增 ID (AUTO_INCREMENT
) ,當你刪除其中一條,會造成自增 ID 不連續,這可能導致需要使用 ID 進行判斷時的不准確,這時可能會考慮重置自增 ID。
本教程將介紹多種重置 MySQL 自增 ID 的方法,特別是不會刪除數據的重置自增 ID 法,非常好用。
另外推薦一下卡拉雲 - 可與 MySQL 搭配使用。卡拉雲是一套低代碼開發工具,無需部署,開箱即用。它可接入常見的數據庫(MySQL、MongoDB等)及 RESTful API, 你無需懂會任何前端技術,只要會寫 SQL,就可以快速搭建屬於你自己的數據庫管理工具。>> 深入了解卡拉雲 <<
一. 創建測試示例
首先我們創建一個數據庫 kalacloud_demo
及表 kalacloud_table_demo
來作為本教程的演示示例:
CREATE DATABASE kalacloud_demo; USE kalacloud_demo; CREATE TABLE kalacloud_table_demo ( id INT NOT NULL AUTO_INCREMENT, test VARCHAR(45) DEFAULT NULL, PRIMARY KEY (id) );
然后我們向 kalacloud_table_demo
表中插入一組測試數據:
INSERT INTO kalacloud_table_demo(test) VALUES('kalacloud 1'), ('kalacloud 2'), ('kalacloud 3');
我們來使用 SELECT
看一下效果:
SELECT * FROM kalacloud_table_demo;
我們可以看到示例表中,id 列的值是連續的1、2、3
接着,我們刪除 ID 3,然后再插入一條新數據,看看變化。
DELETE FROM kalacloud_table_demo WHERE ID = 3; INSERT INTO kalacloud_table_demo(test) VALUES('kalacloud insert 3'); SELECT * FROM kalacloud_table_demo;
從返回結果可以看到,我們刪除 ID 3 這一行后,再插入一行 ID 自增是從 4 開始的。接下來,我們來講解如何重置 ID,使它回復到連續數。
二. 使用 ALTER TABLE 重置自增 ID
接前文示例,我們先刪掉 ID 4 ,再使用 ALTER TABLE
重置表 ID:
DELETE FROM kalacloud_table_demo WHERE ID = 4;
使用 ALTER TABLE
重置自增 ID:
ALTER TABLE table_name AUTO_INCREMENT = value;
table_name
為當前要重置自增 ID 的表名。value
必須是大於當前表中最大 ID 數,本示例中當前表最大數為 2,我們可以設置成 3。
我們使用以下命令將 kalacloud_table_demo
自增 ID 重置為 3
ALTER TABLE kalacloud_table_demo AUTO_INCREMENT = 3;
接着,我們插入一行數據,看一下效果。
INSERT INTO kalacloud_table_demo(test) VALUES('kalacloud insert 3'); SELECT * FROM kalacloud_table_demo;
從返回結果我們可以看到,新插入的數據不再從 4 開始,而是按照我們剛剛重置的數,從 3 開始。
三. 使用 TRUNCATE TABLE 重置自增 ID
TRUNCATE TABLE
原理是刪除掉表中全部數據並釋放空間,達到重置 ID 的效果,但它與 DROP TABLE
(直接刪除表)不同,它不會刪掉表本身,也不會刪掉表的定義,僅清空表數據。
TRUNCATE TABLE kalacloud_table_demo;
表數據被清空后,新寫入的數據,肯定就從 ID 1 重新開始了。
但在現實操作中,我們怎么可能就為了重置 ID ,把一個填滿內容的數據庫清空呢,這個操作在多數場景中並不實際。
接下來,我們來講解如何使用 直接刪除 ID 法和替換法來保住數據的前提下,重置 ID。
四. 保留數據重置 - 直接刪除 ID 法
此方法的原理是直接把 ID 列刪掉,然后重新新建 ID 列,從而達到保留數據,重置 ID 的效果。
接上文數據,大家可以跟着本教程一起重置演示的表數據,方便繼續演示操作:
TRUNCATE TABLE kalacloud_table_demo; INSERT INTO kalacloud_table_demo(test) VALUES('kalacloud 1'), ('kalacloud 2'), ('kalacloud 3'); DELETE FROM kalacloud_table_demo WHERE ID = 3; INSERT INTO kalacloud_table_demo(test) VALUES('kalacloud insert 3'); SELECT * FROM kalacloud_table_demo;
我們使用 SELECT 查看表數據,可以看到 ID 為 1、2、4
演示數據就緒,接着我們開始重置 ID
我們先刪除 ID 列:
ALTER TABLE kalacloud_table_demo DROP id;
然后再插入新 ID 列:
ALTER TABLE kalacloud_table_demo ADD id mediumint(6) PRIMARY KEY NOT NULL AUTO_INCREMENT FIRST;
最后用 SELECT
看一下表的變化:
SELECT * FROM kalacloud_table_demo;
可以看到表 ID 已經重置。
這種方法對於數據量較大的表有一定風險。此方法在刪除 ID 后,重新加入新 ID 時,有可能順序會被打亂,保險起見,我們可以使用另一種在保護數據的前提下,重置 ID 的方法。
五. 保留數據重置 - 兩步替換 ID 法
為了保證刪除 ID 列后,再加入新 ID 列這種方法不會打亂原有數據的順序,我們可以使用更保守一些的替換法,達到重置 ID 的效果。
我們重置一下示例數據:
TRUNCATE TABLE kalacloud_table_demo; INSERT INTO kalacloud_table_demo(test) VALUES('kalacloud 1'), ('kalacloud 2'), ('kalacloud 3'); DELETE FROM kalacloud_table_demo WHERE ID = 3; INSERT INTO kalacloud_table_demo(test) VALUES('kalacloud insert 3'); SELECT * FROM kalacloud_table_demo;
接下來,我們使用替換法把示例數據的 ID 重置為 1、2、3
首先,取消 kalacloud_table_demo
表中 ID 列的自增和主鍵的定義:
ALTER TABLE kalacloud_table_demo MODIFY COLUMN id int NOT NULL FIRST ,DROP PRIMARY KEY;
在表里新增 id_renew
列,設置為自增(AUTO_INCREMENT
)主鍵(PRIMARY KEY
),我們將使用這個列來替換 ID
列。
ALTER TABLE kalacloud_table_demo ADD COLUMN id_renew int NULL AUTO_INCREMENT FIRST ,ADD PRIMARY KEY (id_renew);
使用 SELECT
查看當前表情況,可以看到新增的 id_renew
這一列的順序已經是連續的了。
接着,我們可以刪除掉原來亂序的 ID 列
ALTER TABLE kalacloud_table_demo DROP COLUMN id;
最后,我們將 id_renew
,重命名,更為 id
ALTER TABLE kalacloud_table_demo CHANGE COLUMN id_renew id int(7) NOT NULL AUTO_INCREMENT FIRST;
我們使用 SELECT
來看一下效果:
可以看到,在保護數據以及數據順序不被打亂的前提下,我們重置了 ID 列的數字順序。
六. 總結
本教程詳細講解了四種 MySQL 重置自增 ID 的方法,他們各有各的特點。
- ALTER TABLE 重置法:適合表格剛剛被打亂,亂序的位置之后的數據量不多的情況
- TRUNCATE TABLE 重置法:適合表格中數據不重要,可清空重來。
- 保留數據重置 - 直接刪除 ID 法:數據量較小時。
- 保留數據重置 - 兩步替換 ID 法:前一種方法的保守方法,數據更安全。