天天看點

資料庫——SQL中delete,truncate和drop的差別

相同點:

1.不帶where子句的delete、truncate和drop都會删除表内的所有資料。

2.drop、truncate都是DDL語句,執行後會自動送出。

不同點:

1. truncate和delete 隻删除資料,表結構不變;

    drop會删除整個表(包括表結構),drop将删除表的結構被依賴的限制(constrain),觸發器(trigger)和索引(index),依賴于該表     的存儲過程/函數将保留,但變為無效狀态。

2. delete 屬于DML,該操作會放到 rollback segment 中,事務送出之後才生效,可復原,若有相應的 trigger,執行的時候将被觸發;

    truncate、drop 屬于DDL,操作立即生效,原資料不放到 rollback segment 中,不能復原,操作不觸發 trigger。

3. delete 操作不會減少表或索引所占空間;

    truncate 會将該表和索引所占空間恢複到初始大小;

    drop 語句将表所占用的空間全部釋放。

4.速度,一般來說: drop> truncate > delete

5.使用範圍:truncate隻能對table,delete可對table和view

6.安全性:小心使用 drop 和 truncate,尤其沒有備份的時候.

  使用上,想删除部分資料行用 delete,注意帶上where子句. 復原段要足夠大; 

  想删除表,當然用 drop;

  想保留表而将所有資料删除,若與事務無關,用truncate,若與事務有關,或者想觸發trigger,用delete。

  若是整理表内部的碎片,可用truncate跟上reuse stroage,再重新導入/插入資料。

7.對于由foreign key限制引用的表,不能用truncate,而應使用不帶where的delete,由于truncate不記錄在日志中,無法激活觸發器。

8.delete需手動commit送出才會生效,可通過rollback撤銷,且不影響表所占用的extent,高水線(high watermark)保持原位置不變;

   truncate會删除表中所有記錄,并且将重新設定高水線和所有的索引,預設情況下将空間釋放到minextents個extent,除非用reuse storage,不   會記錄日志。

“Truncate  table  表名” 速度快且效率高的原因:

    分析:truncate table 在功能上與不帶where的delete語句相同:二者均删除表中的全部行。

       但truncate table比delete速度快,且使用的系統和事務日志資源少。delete語句每次删除一行,并在事務日志中為所删除的每行記錄        一項。truncate table通過釋放存儲表資料所用的資料頁來删除資料,隻在事務日志中記錄頁的釋放。