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

MySQL从表中删除所有行并将ID重置为零,mysql,Mysql,我需要删除表中的所有行,但当我添加新行时,我希望主键ID(具有自动递增功能)分别从0和1重新开始。不要删除,请使用truncate: Truncate table XXX 表处理程序不记得上次使用的自动增量值,但从一开始就开始计数。即使是MyISAM和InnoDB也是如此,它们通常不重用序列值 .如果无法使用截断(例如,由于外键限制),可以在删除所有行后使用alter table重新启动自动增量: ALTER TABLE mytable AUTO_INCREMENT = 1 一个有趣的事实

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

不要删除,请使用truncate:

Truncate table XXX
表处理程序不记得上次使用的自动增量值,但从一开始就开始计数。即使是MyISAM和InnoDB也是如此,它们通常不重用序列值


.

如果无法使用
截断
(例如,由于外键限制),可以在删除所有行后使用alter table重新启动自动增量:

ALTER TABLE mytable AUTO_INCREMENT = 1
一个有趣的事实

我确信
TRUNCATE
将始终执行得更好,但在我的例子中,对于一个包含大约30个带有外键的表、只填充了几行的数据库来说,
TRUNCATE
所有表大约需要12秒,而
删除这些行只需要几百毫秒。
设置自动增量总共会增加大约一秒钟,但仍然要好得多


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

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

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 ;

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

如果您想使用
截断
请使用以下选项:

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

@NBhargav因为您可能在表上使用InnoDB引擎而不是MyISAM,第一个不支持重置索引。如何在更改自动增量之前删除所有行value@KasunSiyambalapitiya
从tablename中删除(但是,当有FK约束时,这不会很好用)——截断函数与非约束表很好地工作,但是如果表有外键约束,您可以考虑使用Delphi方法。如果您有FK约束,请参阅本文:请记住truncate table不会回滚这是一种在任何表中包含孤立数据的好方法,该表的外键指向要擦除的表。据我所知,在事后启用外键检查不会导致MySQL重新验证这些外键。这会留下包含引用表中不存在的数据的行。您甚至可以在表中根本没有外键。对于测试和调试数据库来说,这就是答案。