1、從概念上來講,它們是不同的,truncate是DDL語句,會隱式提交,所以,不能回滾,不會觸發觸發器。delete是DML語句,這個操作會被放到 rollback segment中,事務提交后才生效。如果有相應的觸發器,執行的時候將被觸發。
2、語法結構不同,truncate會刪除表中所有數據,delete后面可以跟where進行條件過濾,如果不跟任何條件,也會刪除所有數據
其他的不同,我們結合實例來說明,首先要創建一個表,建表語句如下:
再創建一個存儲過程,方便插入數據:
3、第三點不同就是,truncate是整體刪除,速度較快,而delete是逐條刪除,速度較慢
使用存儲過程向student表中插入10萬條數據,命令是call insert_student(100000),用truncate和delete兩種方法清空表中數據,查看耗時,表中已插入10萬條數據:
truncate table student執行耗時為:
再插入同樣的數據量,delete from student耗時為:
數據量比較少,不過也能看出來執行耗時的明顯區別,而delete執行后的顯示信息有Affected rows,可見是逐條執行的
4、truncate不寫服務器log,delete寫服務器log,從這點也可以明白truncate效率比delete高的原因
5、truncate刪除數據后,會把自增字段的值給重置,而delete會記住上次的自增字段值,再次插入后會接著上次字段值來增加
用truncate刪除數據后,再增加5條,結果如下:
可以發現自增字段重置了,用delete刪除上面的5條數據,然后向表中再添加3條數據,結果如下:
可以看出,delete記住上次自增的字段,在原來的基礎上進行自增。
6、表和索引所占空間的不同。當表被truncate 后,這個表和索引所占用的空間會恢復到初始大小,delete操作不會減少表或索引所占用的空間。