2010-04-08 51 views
16

我試圖清理一個表,但沒有擺脫表的實際結構。我有一個id列是自動遞增的;我不需要保留身份證號碼,但我確實需要它來保持自動遞增的特性。我發現刪除和截斷,但我擔心其中的一個將完全放棄整個表渲染未來插入命令無用。刪除,截斷或刪除清理MySQL中的表格

如何從表格中刪除所有記錄以便插入新數據?

回答

14

TRUNCATE將重置自動遞增的種子(在InnoDB表,至少),儘管你可以截斷之前,注意它的價值,並相應地重置之後使用alter table

ALTER TABLE t2 AUTO_INCREMENT = value 
+0

注意到自動增量種子的好處!我忘了提及 – 2010-04-08 16:19:58

+0

我看到感謝的人! – 2010-04-08 18:12:12

18

drop table將刪除與數據的整個表

delete * from table將刪除數據,僅保留自動增量值。如果表中有很多數據,也需要一段時間。

truncate table將刪除數據,重置自動增量值(但將它們保留爲自動增量列,所以它將從1開始並從那裏再次上升),並且非常快。

+0

對於InnoDB'TRUNCATE'並不是那麼快,因爲它在內部執行DROP + CREATE。在我的開發系統上截斷200個小表需要幾秒鐘... – Marki555 2013-03-26 14:39:47

+1

刪除數據是完全記錄的操作。截斷數據的記錄最少 – 2016-11-04 10:27:11

1

另一種可能包括創建表的空副本(非原子操作過程中有一些最終的餘地插入)設置AUTO_INCREMENT然後旋轉都:那麼

CREATE TABLE t2_new LIKE t2; 

SELECT @newautoinc:=auto_increment /*+[leeway]*/ 
    FROM information_schema.tables 
WHERE table_name='t2'; 

SET @query = CONCAT("ALTER TABLE t2_new AUTO_INCREMENT = ", @newautoinc); 
PREPARE stmt FROM @query; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

RENAME TABLE t2 TO t2_old, t2_new TO t2; 

而且,你有在刪除舊桌子之前仍然能夠改變主意的額外優勢。

如果你考慮你的決定,你仍然可以從表中帶回的舊記錄操作前:

INSERT /*IGNORE*/ INTO t2 SELECT * FROM t2_old /*WHERE [condition]*/; 

當你很好,你可以刪除舊錶:

DROP TABLE t2_old; 
4

      刪除只會這樣做....刪除有問題的表,除非該表是另一個表的父代。

      刪除將刪除所有滿足條件的數據;如果沒有指定條件,它將刪除表中的所有數據。
      截斷類似刪除;但是,它會將auto_increment計數器重置爲1(或初始起始值)。但是,最好使用truncate over delete,因爲刪除會刪除每行中的數據,因此具有比truncate更好的性能。但truncate將無法​​在InnoDB表中執行參照完整性,除非在頒發truncate命令前關閉。
     因此,放鬆;除非您在表格上發出放下命令,否則它不會被刪除。