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


182

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

Answers:


303

不要删除,请使用截断:

Truncate table XXX

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

来源


20
截断与不受约束的表一起使用时效果很好,但是如果表具有外键约束,则可以考虑使用Delete方法。如果您有FK约束,请参阅此文章:截断外键约束表
朱利安·索罗

1
请记住,截断表不会回滚
penny chan

83

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

ALTER TABLE mytable AUTO_INCREMENT = 1

3
@NBhargav因为您可能在表上使用InnoDB引擎而不是MyISAM,所以第一个不支持重置索引。
古斯塔沃·卢比奥

如何在更改auto_increment值之前删除所有行
Kasun Siyambalapitiya '16

@KasunSiyambalapitiya DELETE FROM tablename;(但不打算工作做好时,有FK约束-见stackoverflow.com/a/5452798/507761
马修·里德

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 ;

但是区别在于执行时间。看上面索林的答案。


2
这是将孤立表包含在要擦除的表的任何表中的孤立数据的一种好方法。据我所知,在事实发生后启用外键检查不会导致MySQL重新验证那些外键。这将使您留下包含引用表中不存在的数据的行。您甚至可能根本没有外键。
cimmanon 2015年

8

一个有趣的事实。

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

因此,我建议您同时尝试一下,看看哪种方法对您的情况更快。


2

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

SET FOREIGN_KEY_CHECKS = 0; 
TRUNCATE table $table_name; 
SET FOREIGN_KEY_CHECKS = 1;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.