【DB筆試面試476】DELETE、DROP和TRUNCATE的區別是什麼?

  • 2019 年 10 月 11 日
  • 筆記

題目部分

DELETE、DROP和TRUNCATE的區別是什麼?

答案部分

DELETE、DROP和TRUNCATE的異同點如下表所示:

表 3-9 DELETE、DROP和TRUNCATE的區別

相同點

1、TRUNCATE和不帶WHERE子句的DELETE及DROP都會刪除表內的所有數據2、DROP和TRUNCATE都是DDL語句,執行後會自動提交3、表上的索引大小會自動進行維護

不同點

分類

DROP

TRUNCATE

DELETE

是否刪除表結構

刪除表結構及其表上的約束,且依賴於該表的存儲過程和函數等將變為INVALID狀態

只刪除數據不刪除表的定義、約束、觸發器和索引

SQL命令類型

DDL語句,隱式提交,不能對TRUNCATE和DROP使用ROLLBACK命令

DML語句,事務提交(COMMIT)之後才生效,可以使用ROLLBACK語句撤銷未提交的事務

刪除的數據是否放入回滾段(ROLLBACK SEGMENT)

高水位是否下降

是,在宏觀上表現為TRUNCATE操作後,表的大小變為初始化的大小

否,在宏觀上表現為DELETE後表的大小並不會因此而改變,所以,在對整個表進行全表掃描時,經過TRUNCATE操作後的表比DELETE操作後的表要快得多

日誌的產生

少量日誌

少量日誌

大量日誌

是否可以通過閃回查詢來找回數據

是否可以對視圖進行操作

級聯刪除

不能DROP一個帶有ENABLE外鍵的表

不能TRUNCATE一個帶有ENABLE外鍵的表,會報錯ORA-02266

可以DELETE一個帶有ENABLE外鍵的表

執行速度

一般來說,DROP>TRUNCATE>DELETE,DROP和TRUNCATE由於是在底層修改了數據字典,所以,無論是大表還是小表執行都非常快,而DELETE是需要讀取數據到Undo,所以,對於大表進行DELETE全表操作將會非常慢

安全性

DROP和TRUNCATE在無備份的情況下需謹慎

使用方面

想刪除部分數據行只能用DELETE且帶上WHERE子句;想刪除表數據及其結構則使用DROP;想保留表結構而將所有數據刪除則使用TRUNCATE

恢復方法

使用回收站恢復,閃回數據庫,RMAN備份、DUL工具等

閃回數據庫,RMAN備份、DUL工具等

閃回查詢、閃回事務、閃回版本、閃回數據庫等

DELETE和TRUNCATE都可以用來刪除表中所有的記錄。但二者的不同之處主要體現在以下幾個方面的內容:

(1)TRUNCATE是一個DDL語句,DELETE是DML語句。

(2)TRUNCATE將被隱式提交,不能對TRUNCATE使用ROLLBACK命令,而對DML語句可以執行ROLLBACK命令來撤銷未提交的事務。

(3)TRUNCATE由於是在底層修改了數據字典,所以在各種表上無論是大表的還是小表操作都非常快。DELETE操作需要寫日誌,而TRUNCATE不需要寫日誌,所以對於大表進行DELETE全表操作非常慢。

(4)TRUNCATE將重置表的高水位線,但DELETE不會重置表的高水位線,在宏觀上表現為TRUNCATE操作後,表的大小變為初始化的大小,而DELETE後表的大小並不會因此而改變,所以在對整個表進行全表掃描時,經過TRUNCATE操作後的表比DELETE操作後的表要快得多,另外需要注意的是,無論TRUNCATE還是DELETE操作,表上的索引都會自動維護。

(5)TRUNCATE操作後的表不能通過閃回特性來找回,但DELETE後的表可以通過閃回特性來找回數據。

(6)TRUNCATE不能加條件刪除數據;DELETE可以加條件刪除。

(7)不能TRUNCATE一個帶有ENABLE外鍵的表,會報錯ORA-02266。可以DELETE一個帶有ENABLE外鍵的表。

本文選自《Oracle程序員面試筆試寶典》,作者:李華榮。

About Me:小麥苗

● 本文作者:小麥苗,只專註於數據庫的技術,更注重技術的運用

● 作者博客地址:http://blog.itpub.net/26736162/abstract/1/

● 本系列題目來源於作者的學習筆記,部分整理自網絡,若有侵權或不當之處還請諒解

● 版權所有,歡迎分享本文,轉載請保留出處

● 題目解答若有不當之處,還望各位朋友批評指正,共同進步