一、區別
1.去什么?
truncate table 和 delete只刪除數據(記錄)不刪除表的結構;drop語句將刪除表的數據(記錄)和表結構依賴的約束(constrain),觸發器(trigger),索引(index),保留依賴於該表的存儲過程/函數,但是變為invalid狀態 .
譬如:delete 是單殺,truncate 是團滅,drop 是把電腦摔了。
2.范疇:
delete 是 DML 語句,操作完以后如果沒有不想提交事務還可以回滾,truncate 和 drop 是 DDL 語句,操作完馬上生效,不能回滾.
譬如:delete 是發微信說分手,后悔還可以撤回,truncate 和 drop 是直接扇耳光說滾,不能反悔。
3.在自增字段的表中:
truncate之后的自增字段從1開始計數了[即truncate是摧毀原來的表重新創建一張結構相同的表(有原表的結構)],delete的仍保留原來的最數數值[即如果添加數據從最值+1開始],drop將表的結構也刪除了(原表數據和結構都沒有了)。
譬如:drop 是神舟火箭,truncate 是和諧號動車,delete 是自行車。
二、總結:
1.執行速度:一般,drop> truncate > delete。
2.在使用drop和truncate時一定要注意,雖然可以恢復,但為了減少麻煩,還是要慎重。
3.如果想刪除部分數據用delete,注意帶上where子句,回滾段要足夠大;
如果想刪除表,當然用drop;
如果想保留表而將所有數據刪除,如果和事務無關,用truncate即可;
如果和事務有關,或者想觸發trigger,還是用delete
如果是整理表內部的碎片,可以用truncate跟上reuse stroage,再重新導入/插入數據