轉https://blog.csdn.net/qq_40087415/article/details/78812019
刪除表(記錄和結構)的語名:delete —— truncate —— drop
delete (刪除數據表里記錄的語句)
delete from 表名 where 條件;
注意:刪除記錄並不能釋放Oracle里被占用的數據塊表空間。它只把那些被刪除的數據塊標成unused
如果確實要刪除一個大表里的全部記錄, 可以用 truncate 命令, 它可以釋放占用的數據塊表空間
truncate table 表名;
此操作不可回退.
相同點
truncate 和不帶 where 子句的 delete, 以及 drop 都會刪除表內的數據
注意:這里說的 delete 是指不帶 where 子句的 delete 語句
不同點
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 ,再重新導入/插入數據
oracle中刪除表中的一列語句
alter table 表名 drop colum 列名
