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

我需要从一个表中删除所有行,但当我添加一个新行时,我希望主键ID(它具有自动增量)分别从0开始从1开始。

304428 次浏览

不要删除,使用truncate:

Truncate table XXX

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

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

ALTER TABLE mytable AUTO_INCREMENT = 1

一个有趣的事实。

我确信TRUNCATE总是会执行得更好,但在我的例子中,对于一个大约有30个带外键的表的数据库,只填充了几行,TRUNCATE所有表需要大约12秒,而DELETE行只需要几百毫秒。 设置自动增量总共增加了大约一秒,但仍然好得多

所以我建议两种都试试,看看哪种对你的情况更有效。

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

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 ;

但不同之处在于执行时间。看看上面索林的回答。

如果你想使用truncate,使用这个:

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