萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> mysql教程 >> sql中truncate,delete,drop的區別

sql中truncate,delete,drop的區別

這三個命令的相同點truncate和不帶where子句的delete, 以及drop都會刪除表內的數據,不同點是truncate會清除表數據表置id從1開始,delete就只刪除記錄,drop可以用來刪除表或數據庫並且將表所占用的空間全部釋放

不同點:
1. truncate和 delete只刪除數據不刪除表的結構(定義)
drop語句將刪除表的結構被依賴的約束(constrain),觸發器(trigger),索引(index); 依賴於該表的存儲過程/函數將保留,但是變為invalid狀態.

 代碼如下 復制代碼

Truncate是SQL中的一個刪除數據表內容的語句,用法是:

  語法   TRUNCATE TABLE name   
   參數   name   

是要截斷的表的名稱或要刪除其全部行的表的名稱

Truncate table 表名 速度快,而且效率高,因為:   TRUNCATE TABLE 在功能上與不帶 WHERE 子句的 DELETE 語句相同:二者均刪除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系統和事務日志資源少


2.delete語句是dml,這個操作會放到rollback segement中,事務提交之後才生效;如果有相應的trigger,執行的時候將被觸發.
truncate,drop是ddl, 操作立即生效,原數據不放到rollback segment中,不能回滾. 操作不觸發trigger.

DELETE 語句
DELETE 語句用於刪除表中的行。

語法

 代碼如下 復制代碼

DELETE FROM 表名稱 WHERE 列名稱 = 值

"Fred Wilson" 會被刪除:

DELETE FROM Person WHERE LastName = 'Wilson'

刪除所有行
可以在不刪除表的情況下刪除所有的行。這意味著表的結構、屬性和索引都是完整的:

 代碼如下 復制代碼

DELETE FROM table_name或者:

DELETE * FROM table_name


3.delete語句不影響表所占用的extent
drop語句將表所占用的空間全部釋放
truncate 語句缺省情況下見空間釋放到 minextents個 extent,除非使用reuse storage.
4.速度,一般來說: drop> truncate > delete

有時候我們會決定我們需要從數據庫中清除一個表格。事實上,如果我們不能這樣做的話,那將會是一個很大的問題,因為數據庫管理師 (Database Administrator -- DBA) 勢必無法對數據庫做有效率的管理。還好,SQL 有提供一個 DROP TABLE的語法來讓我們清除表格。 DROP TABLE 的語法是:

 代碼如下 復制代碼

DROP TABLE "表格名"

我們如果要清除在SQL CREATE 中建立的顧客表格,我們就打入:

 代碼如下 復制代碼 DROP TABLE customer.


5.安全性:小心使用drop 和truncate,尤其沒有備份的時候.否則哭都來不及
使用上,想刪除部分數據行用delete,注意帶上where子句. 回滾段要足夠大.
想刪除表用drop
想保留表而將所有數據刪除. 如果和事務無關,用truncate即可. 如果和事務有關,或者想觸發trigger,還是用delete.
如果是整理表內部的碎片,可以用truncate跟上reuse stroage,再重新導入/插入數據。

總結,在使用上面三種命令時最好用delete來代替,其它兩個都是非常危險工作,一不小心你的數據庫或表可能被刪除或清除哦。

copyright © 萬盛學電腦網 all rights reserved