2012-09-29 56 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