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






