我需要删除表中的所有行,但是当我添加一个新行时,我希望主键ID(具有自动增量)从0开始分别从1开始。
答案 0 :(得分:287)
请勿删除,请使用truncate:
Truncate table XXX
表处理程序不记得上次使用的AUTO_INCREMENT值,但从头开始计数。即使对于通常不重用序列值的MyISAM和InnoDB也是如此。
答案 1 :(得分:75)
如果你不能使用TRUNCATE
(例如由于外键约束),你可以在删除所有行后使用alter table来重启auto_increment:
ALTER TABLE mytable AUTO_INCREMENT = 1
答案 2 :(得分:16)
如果表有外键,那么我总是使用以下代码:
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 ;
但差异在于执行时间。请看索林的答案。
答案 3 :(得分:8)
一个有趣的事实。
我确信TRUNCATE
总是会表现得更好,但在我的情况下,对于一个包含大约30个带外键的表的数据库,只填充了几行,TRUNCATE
大约需要12秒所有表,而不是几百毫秒到DELETE
行。
设置自动增量总共增加了一秒,但它仍然好多了。
所以我建议尝试两种方法,看看哪种方法更适合您的情况。
答案 4 :(得分:4)
如果您想使用truncate
,请使用以下命令:
SET FOREIGN_KEY_CHECKS = 0;
TRUNCATE table $table_name;
SET FOREIGN_KEY_CHECKS = 1;