202

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

4

5 回答 5

338

不要删除,使用截断:

Truncate table XXX

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

来源

于 2012-09-29T10:20:18.193 回答
95

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

ALTER TABLE mytable AUTO_INCREMENT = 1
于 2012-09-29T10:47:05.343 回答
18

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

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 ;

但不同之处在于执行时间。看上面索林的回答。

于 2015-10-13T18:31:09.963 回答
8

一个有趣的事实。

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

所以我建议两者都试一下,看看哪个更适合你的情况。

于 2014-02-17T12:13:40.560 回答
5

如果你想truncate使用这个:

SET FOREIGN_KEY_CHECKS = 0; 
TRUNCATE table $table_name; 
SET FOREIGN_KEY_CHECKS = 1;
于 2020-03-20T19:46:11.167 回答