天天看點

Truncate/Delete/Drop table的特點和差別

之前一直對Truncate/Delete/Drop認識的不是很清晰,是以特意的翻了一下MySQL5.7 Reference Manual,準備系統的了解一下,這裡是一些翻譯,外加一點自己的認知。

Truncate的特點

  • 邏輯上truncate table和delete from table_name;相似,但是過程是先drop table,然後在re-create table,如果要清空一個大表的所有資料行,truncate比delete高效;
  • Truncate是一個DDL操作,一旦執行會隐式送出,這就說明truncate無法rollback,是以執行之前需謹慎;
  • 如果表被鎖住,truncate會報錯;
  • 如果有外鍵限制,truncate也會報錯;
  • 對于InnoDB/MyISAM表的auto_increment的列,truncate table之後可以重新使用序列值;
  • truncate table無法觸發delete相關的觸發器;

Delete的特點

Delete是DML操作,如果沒有送出,可以rollback;

對于InnoDB/MyISAM表的auto_increment的列,delete table之後可以無法重新使用序列值,但是重新開機之後可以重新使用序列;

Delete from table_name後面一定要跟where條件,否則會删除表的所有行;

Drop的特點

Drop table除了在資料庫層面删除表,還會在系統層面删除xxx.ibd,xxx.frm(InnoDB表)或 xxx.MYD,xxx.MYI,xxx.frm (MyISAM)等檔案;

drop table if exists table_name可以防止表不存在的報錯,但是會有一個warning;

drop table也會隐式送出,除了臨時表;

參考連結

https://dev.mysql.com/doc/refman/5.7/en/truncate-table.html https://dev.mysql.com/doc/refman/5.7/en/delete.html https://dev.mysql.com/doc/refman/5.7/en/drop-table.html

繼續閱讀