MySQL / MariaDB 重置自增 ID (AUTO_INCREMENT)教程 - 完美保留表數據的終極解決方案


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演示示例

我們可以看到示例表中,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;

使用 alfter table 更新自增 ID

從返回結果我們可以看到,新插入的數據不再從 4 開始,而是按照我們剛剛重置的數,從 3 開始。

三. 使用 TRUNCATE TABLE 重置自增 ID

TRUNCATE TABLE 原理是刪除掉表中全部數據並釋放空間,達到重置 ID 的效果,但它與 DROP TABLE (直接刪除表)不同,它不會刪掉表本身,也不會刪掉表的定義,僅清空表數據。

TRUNCATE TABLE kalacloud_table_demo;

TRUNCATE TABLE 重置自增 ID

表數據被清空后,新寫入的數據,肯定就從 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 列這種方法不會打亂原有數據的順序,我們可以使用更保守一些的替換法,達到重置 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);

新增的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替換法重置自增ID

可以看到,在保護數據以及數據順序不被打亂的前提下,我們重置了 ID 列的數字順序。

六. 總結

本教程詳細講解了四種 MySQL 重置自增 ID 的方法,他們各有各的特點。

  • ALTER TABLE 重置法:適合表格剛剛被打亂,亂序的位置之后的數據量不多的情況
  • TRUNCATE TABLE 重置法:適合表格中數據不重要,可清空重來。
  • 保留數據重置 - 直接刪除 ID 法:數據量較小時。
  • 保留數據重置 - 兩步替換 ID 法:前一種方法的保守方法,數據更安全。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM