我試圖清理一個表,但沒有擺脫表的實際結構。我有一個id
列是自動遞增的;我不需要保留身份證號碼,但我確實需要它來保持自動遞增的特性。我發現刪除和截斷,但我擔心其中的一個將完全放棄整個表渲染未來插入命令無用。刪除,截斷或刪除清理MySQL中的表格
如何從表格中刪除所有記錄以便插入新數據?
我試圖清理一個表,但沒有擺脫表的實際結構。我有一個id
列是自動遞增的;我不需要保留身份證號碼,但我確實需要它來保持自動遞增的特性。我發現刪除和截斷,但我擔心其中的一個將完全放棄整個表渲染未來插入命令無用。刪除,截斷或刪除清理MySQL中的表格
如何從表格中刪除所有記錄以便插入新數據?
TRUNCATE
將重置自動遞增的種子(在InnoDB表,至少),儘管你可以截斷之前,注意它的價值,並相應地重置之後使用alter table:
ALTER TABLE t2 AUTO_INCREMENT = value
drop table
將刪除與數據的整個表
delete * from table
將刪除數據,僅保留自動增量值。如果表中有很多數據,也需要一段時間。
truncate table
將刪除數據,重置自動增量值(但將它們保留爲自動增量列,所以它將從1開始並從那裏再次上升),並且非常快。
對於InnoDB'TRUNCATE'並不是那麼快,因爲它在內部執行DROP + CREATE。在我的開發系統上截斷200個小表需要幾秒鐘... – Marki555 2013-03-26 14:39:47
刪除數據是完全記錄的操作。截斷數據的記錄最少 – 2016-11-04 10:27:11
另一種可能包括創建表的空副本(非原子操作過程中有一些最終的餘地插入)設置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;
刪除只會這樣做....刪除有問題的表,除非該表是另一個表的父代。
刪除將刪除所有滿足條件的數據;如果沒有指定條件,它將刪除表中的所有數據。
截斷與類似刪除;但是,它會將auto_increment計數器重置爲1(或初始起始值)。但是,最好使用truncate over delete,因爲刪除會刪除每行中的數據,因此具有比truncate更好的性能。但truncate將無法在InnoDB表中執行參照完整性,除非在頒發truncate命令前關閉。
因此,放鬆;除非您在表格上發出放下命令,否則它不會被刪除。
注意到自動增量種子的好處!我忘了提及 – 2010-04-08 16:19:58
我看到感謝的人! – 2010-04-08 18:12:12