關於文章,本文是在網上查找資料整理而來,方便以後記憶 delete 命令刪除的數據可以恢復, truncate 命令刪除的數據是不可以恢復的,全刪的那種 drop 命令刪除的數據不可恢復,連表結構都刪的那種 相同點 truncate 和不帶 where 子句的 delete, 以及 drop 都會刪 ...
關於文章,本文是在網上查找資料整理而來,方便以後記憶
delete 命令刪除的數據可以恢復,
truncate 命令刪除的數據是不可以恢復的,全刪的那種
drop 命令刪除的數據不可恢復,連表結構都刪的那種
相同點
truncate 和不帶 where 子句的 delete, 以及 drop 都會刪除表內的數據。
不同點:
1. truncate 和 delete 只刪除數據不刪除表的結構,drop 語句將刪除表的結構被依賴的約束(constrain), 觸發器(trigger), 索引(index); 依賴於該表的存儲過程/函數將保留, 但是變為 invalid 狀態。
2.delete 語句是 dml, 這個操作會放到 rollback segement 中, 事務提交之後才生效; 如果有相應的 trigger, 執行的時候將被觸發。 truncate, drop 是 ddl, 操作立即生效, 原數據不放到 rollback segment 中, 不能回滾。 操作不觸發 trigger。
3.delete 語句不影響表所占用的 extent, 高水線(high watermark)保持原位置不動。 顯然 drop 語句將表所占用的空間全部釋放 。 truncate 語句預設情況下見空間釋放到 minextents 個 extent, 除非使用 reuse storage; truncate會將高水線複位(回到最開始)。
4.速度:一般來說: drop > truncate > delete 。
5.安全性: 小心使用 drop 和 truncate, 尤其沒有備份的時候。否則哭都來不及。
使用上, 想刪除部分數據行用 delete, 註意帶上 where 子句。 回滾段要足夠大。
想刪除表, 當然用 drop。
想保留表而將所有數據刪除。如果和事務無關, 用 truncate 即可。 如果和事務有關, 或者想觸發 trigger, 還是用 delete。
如果是整理表內部的碎片, 可以用 truncate 跟上 reuse stroage, 再重新導入/插入數據。