Delete/truncate/drop區別 1.delete/truncate 只刪除數據不刪除表,索引的結構。 drop 將刪除表的結構及依賴的 index/constrain/trigger,依賴於該表的 procedure/function 將保留,但是變為 invalid 狀態; 2. delete 是 dml語句,寫 rollback segement,可以回滾,但是速度慢,事務提交之後才生效。一次性大批量數據的 delete 可能導致回滾段急劇擴展從而影響到數據庫,慎用,觸發 trigger。 truncate/drop 是 ddl,隱式提交,不寫 rollback segment,不能回滾,速度快。 3. delete 不影響表所占用的 extent,HWM 保持原位置不動,即使刪除的是最靠近 HWM 的數據。delete 其實也可以釋放空間,但是不降低 HWM,delete 後 block 的空閒空間達到 pct_used,就可以重用。 truncate 缺省情況下將空間(表和索引)釋放到 minextents 個 extent,除非使用 reuse storage。truncate 會將高水線復位(回到最開始)。 drop 將表所占用的空間全部釋放,segment 不存在,無所謂 HWM 的概念; 4. truncate/drop 的對象必須是本模式下的,或者被授予 drop any table 的權限,但 drop any table 權限不能 truncate/drop sys 的表。 delete 的對象必須是本模式下的,或者被授予 delete on SCHEMA.table 或 delete any table 的權限,但 delete any table 權限不能 delete sys 的表; 5. 不能 truncate 一個帶有 enable 外鍵的表,不管表裡有沒有數據,如果要 truncate,首先要 disable 外鍵或者刪除外鍵(drop 外鍵的表肯定是刪除了外鍵)。不能 drop 一個帶有 enable 外鍵的表,不管表裡有沒有數據,如果要 drop,首先要刪除外鍵,或者直接用 drop table TABLE_NAME cascade constraints; 級聯刪除外鍵。 delete 可以。