你清楚drop、truncate、delete之間的區(qū)別嗎?

數(shù)據(jù)庫就是用來存儲數(shù)據(jù)的,所有的數(shù)據(jù)都根據(jù)業(yè)務分門別類,存儲在對應的表中,我們經常會對數(shù)據(jù)進行刪除操作,看下drop與truncate區(qū)別,truncate與delete區(qū)別,drop與delete區(qū)別

1.drop與truncate與delete功能與特點

01.Drop的特點
Drop table除了在數(shù)據(jù)庫層面刪除表,還會在系統(tǒng)層面刪除xxx.ibd,xxx.frm(InnoDB表)或 xxx.MYD,xxx.MYI,xxx.frm (MyISAM)等文件;
drop table if exists table_name可以防止表不存在的報錯,但是會有一個warning;
drop table也會隱式提交,除了臨時表;
02.Truncate的特點
?邏輯上truncate table和delete from table_name;相似,但是過程是先drop table,然后在re-create table,如果要清空一個大表的所有數(shù)據(jù)行,truncate比delete高效;
?Truncate是一個DDL操作,一旦執(zhí)行會隱式提交,這就說明truncate無法rollback,所以執(zhí)行之前需謹慎
?如果表被鎖住,truncate會報錯;
?如果有外鍵約束,truncate也會報錯;
?對于InnoDB/MyISAM表的auto_increment的列,truncate table之后可以重新使用序列值;
?truncate table無法觸發(fā)delete相關的觸發(fā)器;
03.Delete的特點
Delete是DML操作,如果沒有提交,可以rollback;
對于InnoDB/MyISAM表的auto_increment的列,delete table之后可以無法重新使用序列值,但是重啟之后可以重新使用序列;
Delete from table_name后面一定要跟where條件,否則會刪除表的所有行;
總結:
01.執(zhí)行效率:drop > truncate > delete
02.在使用drop和truncate時一定要注意,雖然可以恢復,但為了減少麻煩,還是要慎重。
03.如果想刪除部分數(shù)據(jù)用delete,注意帶上where子句,回滾段要足夠大;如果想刪除表,當然用drop;如果想保留表而將所有數(shù)據(jù)刪除,如果和事務無關,用truncate即可;如果和事務有關,或者想觸發(fā)trigger,還是用delete;如果是整理表內部的碎片,可以用truncate跟上reuse stroage,再重新導入/插入數(shù)據(jù)。

2.truncate與delete區(qū)別

在mysql和oracle數(shù)據(jù)庫中delete與truncate都是可以用來對數(shù)據(jù)進行刪除操作,但是二者又有些不同。
01.truncate與delete區(qū)別一
根據(jù)sql語言分類來說,delete屬于DML語言,也就是數(shù)據(jù)操作語言,而truncate屬于DDL語言,也就是數(shù)據(jù)定義語言。
02.truncate與delete區(qū)別二
delete不僅可以刪除表中的數(shù)據(jù),還可以刪除基于真實表創(chuàng)建的視圖中的數(shù)據(jù)。truncate則只能刪除表中的數(shù)據(jù),不能作用于視圖。
03.truncate與delete區(qū)別三
由于delete刪除數(shù)據(jù)涉及到事務處理,會涉及到緩存,當數(shù)據(jù)非常大時,有可能緩存不夠用,所以這時使用delete刪除數(shù)據(jù)可能達不到刪除到的目的,而且速度特別慢。當涉及到大批量的數(shù)據(jù)時,truncate就非常適合,因為他不涉及到緩存,所以速度特別快,效率也高。
04.truncate與delete區(qū)別四
在數(shù)據(jù)庫刪除數(shù)據(jù)時,delete可以根據(jù)需要進行刪除,也就是delete可以結合where條件進行精確的刪除某一條數(shù)據(jù),而truncate則不能支持where子句,如果作用于表,則是直接刪除表所有數(shù)據(jù)。
05.truncate與delete區(qū)別五
delete刪除表時,會涉及到事務處理,也就是可以支持事務提交,回滾。所謂事務就是支持數(shù)據(jù)一致性,原子性,持久性,隔離性。當使用delete刪除表數(shù)據(jù)時,首先它不會真正刪除,而是會將刪除的數(shù)據(jù)放入一個緩存區(qū),可以通過回滾,從而恢復數(shù)據(jù)。但是使用truncate刪除表中數(shù)據(jù)時,truncate不涉及事務處理,所以被truncate刪除的數(shù)據(jù)是不可恢復的。
06.truncate與delete區(qū)別六
在對于一些存在關聯(lián)關系的表,使用delete刪除數(shù)據(jù)時,可以運用sql的業(yè)務邏輯順序來進行達到刪除數(shù)據(jù)的目的。例如表A與表B存在一對多的關系,表A中id為主鍵,并且id在表B中是作為表B的外鍵。要刪除數(shù)據(jù),這時不能直接刪除表B,而應該先刪除表A在進行刪除表B,這樣就達到目的。而truncate不能刪除對于由外鍵約束的表,它達不到刪除該表的目的。
07.truncate與delete區(qū)別七
有時候對數(shù)據(jù)操作可能涉及到觸發(fā)器,用delete刪除數(shù)據(jù)時則有可能會激活觸發(fā)器,進行一些操作。而truncate是不存在觸發(fā)器的處理的。
總結:delete和truncate的應用場景
01.delete適用于數(shù)據(jù)量較小,對于性能要求不是很高的情況下,可以采用delete加上where子句進行刪除數(shù)據(jù)。
02.如果需要考慮事務提交,回滾操作的,適合適用delete進行刪除數(shù)據(jù)。
30.當涉及到大量數(shù)據(jù),而且是不需要回滾的情況下,并且要求速度快,效率高,則可以使用truncate來刪除數(shù)據(jù)。

3.drop和delete的區(qū)別

drop主要用于刪除結構
例如刪除數(shù)據(jù)庫:drop database xx,刪除表+drop table xx。字段也是結構的一種,也可以使用drop了?對的,但是我們改變了表結構要先alter方法。例如,我們要刪除student表上的age字段的信息,可以這樣寫:
alter table fgedu drop age

delete主要用于刪除數(shù)據(jù)
舉個例子,要刪除student表上名字為‘momo’的所有信息:delete from student where name=‘momo’。這種情況下用delete,由此可見delete常用于刪除數(shù)據(jù)。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容