2012-09-29 57 views

回答

264

不要删除,使用截断:

Truncate table XXX 

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

Source

+19

截断可与非约束表很好地协作,但如果您的表具有外键约束,则可以考虑使用Delete方法。如果您有FK约束,请参阅此帖:[truncate foreign key constrained table](http://stackoverflow.com/questions/5452760/truncate-foreign-key-constrained-table) –

+1

请记住截断表不会回滚 –

67

如果您无法使用(因为外键约束,例如)TRUNCATE您可以使用ALTER TABLE删除所有行后,重新启动AUTO_INCREMENT:

ALTER TABLE mytable AUTO_INCREMENT = 1 
+1

这不适合我。可能是什么原因? –

+3

@NBhargav由于您可能在您的表上使用InnoDB引擎而不是MyISAM,因此第一个不支持重置索引。 –

+0

如何在更改auto_increment值之前删除所有行 –

6

一个有趣的事实。

我确信TRUNCATE总会有更好的表现,但在我的情况下,与外键,人口只有几行约30表的数据库,它花了大约12秒,TRUNCATE所有表,而不是只几百毫秒到DELETE的行。 设置自动增量总共增加了大约一秒,但仍然好很多。

所以我会建议尝试两个,看看哪个工作更快为您的情况。

13

如果表有外键,然后我总是用下面的代码:

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 ; 

但差异会在执行时间。看看Sorin的答案。

+1

这是在任何表中使用孤立数据的好方法,这些数据表中的外键将被清除。据我所知,在事实之后启用外键检查不会导致MySQL重新验证这些外键。这使您在参考表中包含包含*不存在*的数据的行。你甚至可以在你的桌子上甚至没有*外键。 – cimmanon