1、從概念上來講,它們是不同的,truncate是DDL語句,會隱式提交,所以,不能回滾,不會觸發(fā)觸發(fā)器。delete是DML語句,這個操作會被放到 rollback segment中,事務提交后才生效。如果有相應的觸發(fā)器,執(zhí)行的時候將被觸發(fā)。
2、語法結構不同,truncate會刪除表中所有數(shù)據(jù),delete后面可以跟where進行條件過濾,如果不跟任何條件,也會刪除所有數(shù)據(jù)
其他的不同,我們結合實例來說明,首先要創(chuàng)建一個表,建表語句如下:

再創(chuàng)建一個存儲過程,方便插入數(shù)據(jù):

3、第三點不同就是,truncate是整體刪除,速度較快,而delete是逐條刪除,速度較慢
使用存儲過程向student表中插入10萬條數(shù)據(jù),命令是call insert_student(100000),用truncate和delete兩種方法清空表中數(shù)據(jù),查看耗時,表中已插入10萬條數(shù)據(jù):

truncate table student執(zhí)行耗時為:

再插入同樣的數(shù)據(jù)量,delete from student耗時為:

數(shù)據(jù)量比較少,不過也能看出來執(zhí)行耗時的明顯區(qū)別,而delete執(zhí)行后的顯示信息有Affected rows,可見是逐條執(zhí)行的
4、truncate不寫服務器log,delete寫服務器log,從這點也可以明白truncate效率比delete高的原因
5、truncate刪除數(shù)據(jù)后,會把自增字段的值給重置,而delete會記住上次的自增字段值,再次插入后會接著上次字段值來增加

用truncate刪除數(shù)據(jù)后,再增加5條,結果如下:

可以發(fā)現(xiàn)自增字段重置了,用delete刪除上面的5條數(shù)據(jù),然后向表中再添加3條數(shù)據(jù),結果如下:

可以看出,delete記住上次自增的字段,在原來的基礎上進行自增。
6、表和索引所占空間的不同。當表被truncate 后,這個表和索引所占用的空間會恢復到初始大小,delete操作不會減少表或索引所占用的空間。