MySQL 清空表数据后重置自增主键 ID 从 1 计数

重置自增变量

在 MySQL 数据库中清空表后重置自增主键 ID 从 1 开始, 可以使用 TRUNCATEDELETE 语句

清空表并重置主键自增ID

要清空表并让自增主键 ID 从 1 开始计数, 通常可以使用 TRUNCATE 语句

TRUNCATE TABLE tablename;

TRUNCATE 会删除表中的所有数据, 同时重置表的自增主键 ID (如果存在的话) 从1开始自增。这是比 DELETE FROM 表名 更快捷的方式, 因为 TRUNCATE 不会逐行删除, 而是直接重置表结构。

例子

假设有一张用户表 users, 表结构如下

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50)
);

如果我们想清空 users 表中的所有数据并让 id 从1重新开始自增, 可以执行

TRUNCATE TABLE users;

清空之后, 插入新的数据时, id 将从1重新开始

使用 DELETE 语句并手动重置自增值

在某些场景下, 如果不想使用 TRUNCATE, 可以使用 DELETE 语句清空表, 再手动重置自增主键 ID。这样可以更细粒度地控制删除操作。

DELETE FROM tablename;
ALTER TABLE tablename AUTO_INCREMENT = 1;

这里的 ALTER TABLE ... AUTO_INCREMENT = 1 会将自增 ID 重置为1。DELETE 适合在表上有外键约束的情况, 因为 TRUNCATE 在有外键的情况下可能会报错。

例子

DELETE FROM users;
ALTER TABLE users AUTO_INCREMENT = 1;

TRUNCATEDELETE 的区别

比较项 TRUNCATE DELETE
执行速度 快速, 直接清空表和重置结构 较慢, 逐行删除
自增ID重置 自动重置 需要手动重置
触发器 不触发 AFTER DELETE 触发器 会触发 AFTER DELETE 触发器
外键约束 如果有外键约束可能会报错 可以在外键约束存在时执行

注意事项

  • TRUNCATEDELETE 操作都是数据不可恢复的操作, 务必在清空数据之前备份表数据

  • 如果表含有外键约束, 优先考虑 DELETE 语句, 或者临时禁用外键约束

    -- 1. 临时禁用外键约束
    SET FOREIGN_KEY_CHECKS = 0;
    
    -- 2. 清空表并重置自增 ID
    TRUNCATE TABLE users;
    
    -- 3. 恢复外键约束
    SET FOREIGN_KEY_CHECKS = 1;
    
  • TRUNCATE 是隐式提交操作, 会立即生效并且无法回滚


原文

MySql数据库表清空后重置主键ID从1开始自增

最后更新于 2019-06-05
使用 Hugo 构建
主题 StackJimmy 设计