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

mar*_*ani 170 mysql

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

Fra*_*ois 291

不要删除,使用truncate:

Truncate table XXX
Run Code Online (Sandbox Code Playgroud)

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

来源.

  • Truncate适用于非约束表,但如果您的表具有外键约束,则可以考虑使用Delete方法.如果您有FK约束,请参阅此文章:[truncate foreign key constrained table](http://stackoverflow.com/questions/5452760/truncate-foreign-key-constrained-table) (19认同)
  • 请记住,截断表不会回滚 (2认同)

a_h*_*ame 79

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

ALTER TABLE mytable AUTO_INCREMENT = 1
Run Code Online (Sandbox Code Playgroud)

  • @NBhargav因为您可能在表上使用InnoDB引擎而不是MyISAM,所以第一个不支持重置索引. (3认同)

小智 17

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

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 ;
Run Code Online (Sandbox Code Playgroud)

但差异在于执行时间.看看Sorin的回答.

  • 这是在任何表中使用孤立数据的好方法,这些表是您要擦除的表的外键.据我所知,在事后启用外键检查不会导致MySQL重新验证这些外键.这将为您留下包含引用表中*不存在*的数据的行.您甚至可能根本没有*在您的桌子上有*外键. (2认同)

小智 8

一个有趣的事实.

我相信TRUNCATE总会有更好的表现,但在我的情况下,与外键,人口只有几行约30表的数据库,它花了大约12秒,TRUNCATE所有的表,而不是只有几百毫秒DELETE的行.设置自动增量总共增加了一秒,但它仍然好多了.

因此,我建议尝试两者,看看哪种方法更适合您的情况.


dav*_*020 5

如果你想truncate使用这个:

SET FOREIGN_KEY_CHECKS = 0; 
TRUNCATE table $table_name; 
SET FOREIGN_KEY_CHECKS = 1;
Run Code Online (Sandbox Code Playgroud)