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

时间:2012-09-29 10:18:45

标签: mysql

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

5 个答案:

答案 0 :(得分:287)

请勿删除,请使用truncate:

Truncate table XXX
  

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

Source

答案 1 :(得分:75)

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

ALTER TABLE mytable AUTO_INCREMENT = 1

答案 2 :(得分:16)

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

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 ;

但差异在于执行时间。请看索林的答案。

答案 3 :(得分:8)

一个有趣的事实。

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

所以我建议尝试两种方法,看看哪种方法更适合您的情况。

答案 4 :(得分:4)

如果您想使用truncate,请使用以下命令:

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