drop truncate和delete的區別

2021-08-16 01:34:15 字數 3700 閱讀 8436

原創 2023年11月22日 19:30:21

(1)delete語句執行刪除的過程是每次從表中刪除一行,並且同時將該行的刪除操作作為事務記錄在日誌中儲存以便進行進行回滾操作。

truncate table 則一次性地從表中刪除所有的資料並不把單獨的刪除操作記錄記入日誌儲存,刪除行是不能恢復的。並且在刪除的過程中不會啟用與表有關的刪除觸發器。執行速度快。

(2)表和索引所佔空間。

當表被truncate 

後,這個表和索引所占用的空間會恢復到初始大小,

delete操作不會減少表或索引所占用的空間。

drop語句將表所占用的空間全釋放掉。

(3)一般而言,

drop > truncate > delete

(4)應用範圍。

truncate 只能對

table

;delete可以是

table

和view

(5)truncate 和

delete

只刪除資料, drop則刪除整個表(結構和資料)。

(6)truncate

與不帶where

的delete 

:只刪除資料,而不刪除表的結構(定義)

drop

語句將刪除表的結構被依賴的約束(

constrain),

觸發器(

trigger)

索引(index);

依賴於該錶的儲存過程

/函式將被保留,但其狀態會變為:

invalid。(7

)delete

語句為dml

(data maintain language),

這個操作會被放到 

rollback segment中,

事務提交後才生效。如果有相應的 

tigger,

執行的時候將被觸發。(8)

truncate

、drop

是dll

(data define language),

操作立即生效,原資料不放到 

rollback segment

中,不能回滾

(9)在沒有備份情況下,謹慎使用 

drop 

與 truncate

。要刪除部分資料行採用

delete

且注意結合

where

來約束影響範圍。回滾段要足夠大。要刪除錶用

drop;

若想保留表而將表中資料刪除,如果於事務無關,用

truncate

即可實現。如果和事務有關,或老師想觸發

trigger,

還是用delete

。(10

) truncate table 

表名 速度快

,而且效率高,因為

:truncate table 在功能上與不帶 

where 

子句的 

delete 

語句相同:二者均刪除表中的全部行。但 

truncate table 

比 delete 

速度快,且使用的系統和事務日誌資源少。

delete 

語句每次刪除一行,並在事務日誌中為所刪除的每行記錄一項。

truncate table 

通過釋放儲存表資料所用的資料頁來刪除資料,並且只在事務日誌中記錄頁的釋放。 

(11) 

truncate table 

刪除表中的所有行,但表結構及其列、約束、索引等保持不變。新行標識所用的計數值重置為該列的種子。如果想保留標識計數值,請改用 

delete

。如果要刪除表定義及其資料,請使用 

drop table 

語句。 

(12) 對於由 

foreign key 

約束引用的表,不能使用 

truncate table

,而應使用不帶 

where 

子句的 

delete 

語句。由於 

truncate table 

不記錄在日誌中,所以它不能啟用觸發器。

一、delete

1、delete

是dml

,執行delete

操作時,每次從表中刪除一行,並且同時將該行的的刪除操作記錄在

redo

和undo

表空間中以便進行回滾(

rollback

)和重做操作,但要注意表空間要足夠大,需要手動提交(

commit

)操作才能生效,可以通過

rollback

撤消操作。

2、delete

可根據條件刪除表中滿足條件的資料,如果不指定

where

子句,那麼刪除表中所有記錄。

3、delete

語句不影響表所占用的

extent

,高水線

(high watermark)

保持原位置不變。

二、truncate

1、truncate

是ddl

,會隱式提交,所以,不能回滾,不會觸發觸發器。

2、truncate

會刪除表中所有記錄,並且將重新設定高水線和所有的索引,預設情況下將空間釋放到

minextents

個extent

,除非使用

reuse storage

,。不會記錄日誌,所以執行速度很快,但不能通過

rollback

撤消操作(如果一不小心把乙個表

truncate

掉,也是可以恢復的,只是不能通過

rollback

來恢復)。

3、對於外來鍵(

foreignkey 

)約束引用的表,不能使用 

truncate table

,而應使用不帶 

where 

子句的 

delete 

語句。4、

truncatetable

不能用於參與了索引檢視的表。

三、drop

1、drop

是ddl

,會隱式提交,所以,不能回滾,不會觸發觸發器。

2、drop

語句刪除表結構及所有資料,並將表所占用的空間全部釋放。

3、drop

語句將刪除表的結構所依賴的約束,觸發器,索引,依賴於該錶的儲存過程

/函式將保留

,但是變為

invalid

狀態。 總結:

1、在速度上,一般來說,

drop> truncate > delete

。 2、在使用

drop

和truncate

時一定要注意,雖然可以恢復,但為了減少麻煩,還是要慎重。

3、如果想刪除部分資料用

delete

,注意帶上

where

子句,回滾段要足夠大;

如果想刪除表,當然用drop

; 如果想保留表而將所有資料刪除,如果和事務無關,用truncate

即可; 如果和事務有關,或者想觸發trigger

,還是用

delete

; 如果是整理表內部的碎片,可以用truncate

跟上reuse stroage

,再重新匯入

/插入資料。

delete和drop truncate的區別

1.truncate和不帶where子句的delete 以及drop都會刪除表內的資料。2.drop truncate都是ddl語句 資料定義語言 執行後會自動提交。1.truncate 和 delete 只刪除資料不刪除表的結構 定義 drop 語句將刪除表的結構被依賴的約束 constrain ...

drop truncate和delete的區別

delete語句執行刪除的過程是每次從表中刪除一行,並且同時將該行的刪除操作作為事務記錄在日誌中儲存以便進行進行回滾操作。truncate table 則一次性地從表中刪除所有的資料並不把單獨的刪除操作記錄記入日誌儲存,刪除行是不能恢復的。並且在刪除的過程中不會啟用與表有關的刪除觸發器。執行速度快。...

drop truncate和delete的區別

1 delete語句執行刪除的過程是每次從表中刪除一行,並且同時將該行的刪除操作作為事務記錄在日誌中儲存以便進行進行回滾操作。truncate table 則一次性地從表中刪除所有的資料並不把單獨的刪除操作記錄記入日誌儲存,刪除行是不能恢復的。並且在刪除的過程中不會啟用與表有關的刪除觸發器。執行速度...