【发布时间】:2012-09-21 00:55:30
【问题描述】:
我需要从表中删除所有行,但是当我添加新行时,我希望具有自动增量的主键 ID 分别从 0 和 1 重新开始。
【问题讨论】:
标签: mysql
我需要从表中删除所有行,但是当我添加新行时,我希望具有自动增量的主键 ID 分别从 0 和 1 重新开始。
【问题讨论】:
标签: mysql
不要删除,使用截断:
Truncate table XXX
表处理程序不记得上次使用的 AUTO_INCREMENT 值,而是从头开始计数。即使对于通常不重用序列值的 MyISAM 和 InnoDB 也是如此。
【讨论】:
如果您不能使用TRUNCATE(例如由于外键约束),您可以在删除所有行后使用alter table 重新启动auto_increment:
ALTER TABLE mytable AUTO_INCREMENT = 1
【讨论】:
DELETE FROM tablename; (但是当有 FK 约束时,这将无法正常工作——请参阅 stackoverflow.com/a/5452798/507761)
如果表有外键,那么我总是使用以下代码:
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 ;
但区别在于执行时间。看上面索霖的回答。
【讨论】:
一个有趣的事实。
我确信TRUNCATE 总是会表现得更好,但在我的情况下,对于一个包含大约 30 个带有外键的表且仅填充几行的数据库,TRUNCATE 所有表需要大约 12 秒,因为与DELETE 行相比只有几百毫秒。
设置自动增量总共增加了大约一秒,但仍然好很多。
所以我建议两者都试一下,看看哪个更适合你的情况。
【讨论】:
如果你想使用truncate,请使用:
SET FOREIGN_KEY_CHECKS = 0;
TRUNCATE table $table_name;
SET FOREIGN_KEY_CHECKS = 1;
【讨论】: