MySQL从表中删除所有行并将ID重置为零
我需要删除表中的所有行,但当我添加新行时,我希望主键ID(具有自动递增功能)分别从0和1重新开始。不要删除,请使用truncate:MySQL从表中删除所有行并将ID重置为零,mysql,Mysql,我需要删除表中的所有行,但当我添加新行时,我希望主键ID(具有自动递增功能)分别从0和1重新开始。不要删除,请使用truncate: Truncate table XXX 表处理程序不记得上次使用的自动增量值,但从一开始就开始计数。即使是MyISAM和InnoDB也是如此,它们通常不重用序列值 .如果无法使用截断(例如,由于外键限制),可以在删除所有行后使用alter table重新启动自动增量: ALTER TABLE mytable AUTO_INCREMENT = 1 一个有趣的事实
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重新验证这些外键。这会留下包含引用表中不存在的数据的行。您甚至可以在表中根本没有外键。对于测试和调试数据库来说,这就是答案。