oracle中經常用到的刪除語句主要有三種,分別是delete,truncate,drop。
1. delete和truncate都是刪除表中的內容而不能刪除表的結構,而drop則是刪除表的結構和內容(表將不復存在);
2. delete可以刪除整個表的數據也可以有選擇性地刪除某一條或多條數據,而truncate則是一次性刪除整個表的數據;
3. 使用delete刪除的表數據並沒有真正被刪掉,數據占用的表空間還存在,相當於Windows中將數據刪除到回收站中,日后有需要還可以恢復;
4. 使用truncate刪除的表數據會連同其占用的表空間一起直接被刪掉,相當於Windows中使用del+shift鍵直接刪除文件一樣,無法恢復。
相同點:
1、truncate和不帶where字句的delete以及drop都會刪除表內數據
2、truncate和drop都是ddl語句(數據定義語句),執行后會自動提交。
不同點:
1、truncate和delete都不刪除表結構,只刪除表數據。drop語句會將表結構、被依賴的關系、觸發器、索引都刪除,保留依賴於該表的存儲過程和函數,但是變為invalid狀態。
2、delete是dml(數據庫操作語言),這個操作會放到rollback segment中,會記錄日志,可以通過回滾操作撤銷刪除的數據,必須通過提交才會真的刪除數據。如果有相應的觸發器trigger,則會觸發。
truncate、drop都是ddl(數據庫定義語言),操作不能回滾,不會記錄到日志中。且不會觸發trigger。
3、delete不影響表占用的表空間extent,高水線(high watermark)保持不動,即刪除內容后,在插入別的語句時,表中的開始位置為刪除前的最高位置。如刪除前表中有三條數據,刪除后插入新數據時,會從第四條開始插入。
drop 將表所占用的表空間全部釋放。
truncate語句缺省情況下會將表空間釋放到最小表空間minextents個extents,除非使用reuse storage;
truncate語句會將高水位線復位。
4、速度上,一般來說drop>truncate >delete。