truncate、drop、delete的異同

第一部分

相同點: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,再重新導入/插入數據


第二部分

1。delete from後面可以寫條件,truncate不可以

2。delete from記錄是一條條刪的,所刪除的每行記錄都會進日誌,而truncate一次性刪掉整個頁,因此日至裏面只記錄頁釋放,簡言之,delete from更新日誌,truncate基本不,所用的事務日誌空間較少

3。delete from刪空表後,會保留一個空的頁,truncate在表中不會留有任何頁

4。當使用行鎖執行 DELETE 語句時,將鎖定表中各行以便刪除。truncate始終鎖定表和頁,而不是鎖定各行。

5。如果有identity產生的自增id列,delete from後仍然從上次的數開始增加,即種子不變,而truncate後,種子會恢復初始

6。truncate不會觸發delete的觸發器,因爲truncate操作不記錄各個行刪除


第三部分

1、TRUNCATE在各種表上無論是大的還是小的都非常快。如果有ROLLBACK命令DELETE將被撤銷,而TRUNCATE則不會被撤銷。

2、TRUNCATE是一個DDL語言,向其他所有的DDL語言一樣,他將被隱式提交,不能對TRUNCATE使用ROLLBACK命令。

3、TRUNCATE將重新設置高水平線和所有的索引。在對整個表和索引進行完全瀏覽時,經過TRUNCATE操作後的表比DELETE操作後的表要快得多。

4、TRUNCATE不能觸發任何DELETE觸發器。

5、不能授予任何人清空他人的表的權限。

6、當表被清空後表和表的索引講重新設置成初始大小,而delete則不能。7、不能清空父表。


總結

TRUNCATE TABLE:刪除內容、釋放空間但不刪除定義。

DELETE TABLE:刪除內容不刪除定義,不釋放空間。

DROP TABLE:刪除內容和定義,釋放空間。


擴展

SQL語言包括三種主要程序設計語言類別的語句:數據定義語言(DDL),數據操作語言(DML)(插,刪,改,排,檢)及數據控制語言(DCL)。

常見的DDL語句

CREATE DATABASE

  創建數據庫
  CREATE {DATABASE | SCHEMA} db_name
  [create_specification [, create_specification] ...]
  create_specification:
  [DEFAULT] CHARACTER SET charset_name
  | [DEFAULT] COLLATE collation_name
  CREATE TABLE
  創建數據庫表格
  CREATE [TEMPORARY] TABLE tbl_name
  [(create_definition,...)]
  [table_options] [select_statement]
  ALTER TABLE
  修改數據庫表格
  ALTER TABLE tbl_name
  alter_specification [, alter_specification] ...
  alter_specification:
  ADD [COLUMN] column_definition [FIRST | AFTER col_name ]
  | ADD [COLUMN] (column_definition,...)
  | ADD INDEX (index_col_name,...)
  | ADD [CONSTRAINT [symbol]]
  PRIMARY KEY (index_col_name,...)
  | ADD [CONSTRAINT [symbol]]
  UNIQUE (index_col_name,...)
  | ADD (index_col_name,...)
  | ADD [CONSTRAINT [symbol]]
  FOREIGN KEY (index_col_name,...)
  [reference_definition]
  | ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}
  | CHANGE [COLUMN] old_col_name column_definition
  [FIRST|AFTER col_name]
  | MODIFY [COLUMN] column_definition [FIRST | AFTER col_name]
  | DROP [COLUMN] col_name
  | DROP PRIMARY KEY
  | DROP INDEX index_name
  | DROP FOREIGN KEY fk_symbol
  | DISABLE KEYS
  | ENABLE KEYS
  | RENAME [TO] new_tbl_name
  | ORDER BY col_name
  | CONVERT TO CHARACTER SET charset_name [COLLATE collation_name]
  | [DEFAULT] CHARACTER SET charset_name [COLLATE collation_name]
  | DISCARD TABLESPACE
  | IMPORT TABLESPACE
  | table_options
  DROP TABLE
  刪除數據庫表格
  DROP [TEMPORARY] TABLE
  tbl_name [, tbl_name] ...
  [RESTRICT | CASCADE]
  CREATE VIEW
  創建查詢命令
  CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
  VIEW view_name [(column_list)]
  AS select_statement
  [WITH [CASCADED | LOCAL] CHECK OPTION]
  ALTER VIEW
  修改查詢命令
  ALTER [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
  VIEW view_name [(column_list)]
  AS select_statement
  [WITH [CASCADED | LOCAL] CHECK OPTION]
  DROP VIEW
  刪除查詢命令
  DROP VIEW
  view_name [, view_name] ...
  [RESTRICT | CASCADE]
  TRUNCATE TABLE
  刪除數據表內容
  TRUNCATE TABLE name [DROP/REUSE STORAGE] 
  DROP STORAGE:顯式指明釋放數據表和索引的空間 
  REUSE STORAGE:顯式指明不釋放數據表和索引的空間

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章