之前一直對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