在mysql和oracle數據庫中delete與truncate都是可以用來對數據進行刪除操作,但是二者又有些不同。
主要有以下幾個區別:
區別一:
根據sql語言分類來說,delete屬於DML語言,也就是數據操作語言,而truncate屬於DDL語言,也就是數據定義語言。
區別二:
delete不僅可以刪除表中的數據,還可以刪除基於真實表創建的視圖中的數據。truncate則只能刪除表中的數據,不能作用於視圖。
區別三:
在數據庫刪除數據時,delete可以根據需要進行刪除,也就是delete可以結合where條件進行精確的刪除某一條數據,而truncate則不能支持where子句,如果作用於表,則是直接刪除表所有數據。
區別四:
delete刪除表時,會涉及到事務處理,也就是可以支持事務提交,回滾。所謂事務就是支持數據一致性,原子性,持久性,隔離性。當使用delete刪除表數據時,首先它不會真正刪除,而是會將刪除的數據放入一個緩存區,可以通過回滾,從而恢復數據。但是使用truncate刪除表中數據時,truncate不涉及事務處理,所以被truncate刪除的數據是不可恢復的。
區別五:
由於delete刪除數據涉及到事務處理,會涉及到緩存,當數據非常大時,有可能緩存不夠用,所以這時使用delete刪除數據可能達不到刪除到的目的,而且速度特別慢。當涉及到大批量的數據時,truncate就非常適合,因為他不涉及到緩存,所以速度特別快,效率也高。
區別六:
有時候對數據操作可能涉及到觸發器,用delete刪除數據時則有可能會激活觸發器,進行一些操作。而truncate是不存在觸發器的處理的。
區別七:
在對於一些存在關聯關系的表,使用delete刪除數據時,可以運用sql的業務邏輯順序來進行達到刪除數據的目的。例如表A與表B存在一對多的關系,表A中id為主鍵,並且id在表B中是作為表B的外鍵。要刪除數據,這時不能直接刪除表B,而應該先刪除表A在進行刪除表B,這樣就達到目的。
而truncate不能刪除對於由外鍵約束的表,它達不到刪除該表的目的。
delete和truncate的應用場景
1.delete適用於數據量較小,對於性能要求不是很高的情況下,可以采用delete加上where子句進行刪除數據。
2.如果需要考慮事務提交,回滾操作的,適合適用delete進行刪除數據。
3.當涉及到大量數據,而且是不需要回滾的情況下,並且要求速度快,效率高,則可以使用truncate來刪除數據。
delete和truncate是用來刪除表數據的(但是保留表結構),而drop是用來刪除整個表的,包括表結構和表內容,在sql語言分類上它是屬於DDL語言。
他們執行的速度快慢關系:drop>truncate>delete。
最后,在企業級項目開發中,對於數據並不是真正的從物理上進行刪除,而是進行邏輯上的刪除,此時會對刪除數據進行一個刪除標識的處理,也就是說只是把數據從頁面上隱藏了,用戶暫時看不見了而已,其實數據是還存在的。
參見: