MySQL 从表中删除所有行并将 ID 重置为零

Posted

技术标签:

【中文标题】MySQL 从表中删除所有行并将 ID 重置为零【英文标题】:MySQL Delete all rows from table and reset ID to zero 【发布时间】:2012-09-21 00:55:30 【问题描述】:

我需要从表中删除所有行,但是当我添加新行时,我希望具有自动增量的主键 ID 分别从 0 和 1 重新开始。

【问题讨论】:

【参考方案1】:

不要删除,使用截断:

Truncate table XXX

表处理程序不记得上次使用的 AUTO_INCREMENT 值,而是从头开始计数。即使对于通常不重用序列值的 MyISAM 和 InnoDB 也是如此。

Source.

【讨论】:

Truncate 适用于非约束表,但如果您的表有外键约束,您可以考虑使用 Delete 方法。如果您有 FK 限制,请参阅此帖子:truncate foreign key constrained table 请记住截断表不会回滚 一个快速的,它工作,我必须清除现有的行并重置自动增量主键列。谢谢。【参考方案2】:

如果您不能使用TRUNCATE(例如由于外键约束),您可以在删除所有行后使用alter table 重新启动auto_increment:

ALTER TABLE mytable AUTO_INCREMENT = 1

【讨论】:

@NBhargav 因为您可能在表上使用 InnoDB 引擎而不是 MyISAM,所以第一个不支持重置索引。 如何在改变 auto_increment 值之前删除所有行 @KasunSiyambalapitiya DELETE FROM tablename; (但是当有 FK 约束时,这将无法正常工作——请参阅 ***.com/a/5452798/507761)【参考方案3】:

如果表有外键,那么我总是使用以下代码:

SET FOREIGN_KEY_CHECKS = 0; -- disable a foreign keys check
SET AUTOCOMMIT = 0; -- disable autocommit
START TRANSACTION; -- begin transaction

/*
DELETE FROM table_name;
ALTER TABLE table_name AUTO_INCREMENT = 1;
-- or
TRUNCATE table_name;
-- or
DROP TABLE table_name;
CREATE TABLE table_name ( ... );
*/

SET FOREIGN_KEY_CHECKS = 1; -- enable a foreign keys check
COMMIT;  -- make a commit
SET AUTOCOMMIT = 1 ;

但区别在于执行时间。看上面索霖的回答。

【讨论】:

这是在您要清除的表的外键的任何表中拥有孤立数据的好方法。据我所知,事后启用外键检查不会导致 mysql 重新验证这些外键。这会为您留下包含参考表中不存在的数据的行。您的桌子上什至可能根本没有外键。【参考方案4】:

一个有趣的事实。

我确信TRUNCATE 总是会表现得更好,但在我的情况下,对于一个包含大约 30 个带有外键的表且仅填充几行的数据库,TRUNCATE 所有表需要大约 12 秒,因为与DELETE 行相比只有几百毫秒。 设置自动增量总共增加了大约一秒,但仍然好很多。

所以我建议两者都试一下,看看哪个更适合你的情况。

【讨论】:

【参考方案5】:

如果你想使用truncate,请使用:

SET FOREIGN_KEY_CHECKS = 0; 
TRUNCATE table $table_name; 
SET FOREIGN_KEY_CHECKS = 1;

【讨论】:

对于测试和调试数据库,这完全是答案。

以上是关于MySQL 从表中删除所有行并将 ID 重置为零的主要内容,如果未能解决你的问题,请参考以下文章

清除表中的所有行,将标识规范重置为零并且不影响外键?

sql 使用Mysql中的ID从表中删除许多行

重置 SQLite3/MySQL 中的行数计数

MySQL ------ 删除数据(DELETE) (二十二)

MySQL ------ 删除数据(DELETE) (二十二)

如何从表中删除不需要的信息?