萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 自增主鍵 ID 重新排序:DROP/ADD COLUMN 與邏輯刪除兩種方案

自增主鍵經 DELETE 產生斷號,若業務需連續編號,可用結構重建或邏輯刪除兩種方式處理。

方案一:重建自增欄位(物理重排)

-- 1. 刪除原主鍵
ALTER TABLE `table_name` DROP `id`;

-- 2. 新增欄位(置於首欄)
ALTER TABLE `table_name` ADD `id` MEDIUMINT(8) NOT NULL FIRST;

-- 3. 設為自增主鍵
ALTER TABLE `table_name` MODIFY COLUMN `id` MEDIUMINT(8) NOT NULL AUTO_INCREMENT,
ADD PRIMARY KEY (`id`);
  • 執行期間會鎖表重建,大表慎用
  • 外鍵關聯表需先刪除 FK,重建後再加回
  • AUTO_INCREMENT 會從 1 重新編號

方案二:邏輯刪除(業務層面保留 ID)

-- 表結構加欄位
ALTER TABLE `table_name` ADD `is_deleted` TINYINT NOT NULL DEFAULT 0;

-- 刪除操作改為更新
UPDATE `table_name` SET `is_deleted` = 1 WHERE `id` = 123;

-- 查詢自動過濾
SELECT * FROM `table_name` WHERE `is_deleted` = 0;
  • 主鍵永不復用,避免外鍵關聯斷裂、歷史追蹤缺失
  • 需在所有查詢加上 is_deleted = 0,建議建立 VIEW 封裝
  • 定期歸檔真正刪除,控制表體積

方案對比

維度重建自增邏輯刪除
ID 連續性✅ 完全連續❌ 保留斷號
外鍵影響⚠️ 需重建 FK✅ 無影響
鎖表時間長(大表分鐘級)極短
歷史追蹤❌ 丟失✅ 完整保留
適用場景小表、無外鍵、需連續編號大表、有關聯、需審計

進階:重置自增值不重建表

-- 僅重置下一個自增值(不重新編號現有行)
ALTER TABLE `table_name` AUTO_INCREMENT = 1;

配合 DELETE 清空表後使用,可讓新資料從 1 開始。

根據業務對「連續性」與「關聯完整性」的權衡選擇方案,邏輯刪除通常是更安全的長期策略。

copyright © 萬盛學電腦網 all rights reserved