這篇文章主要介紹“drop、truncate、delete之間的區(qū)別是什么”,在日常操作中,相信很多人在drop、truncate、delete之間的區(qū)別是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對(duì)大家解答”drop、truncate、delete之間的區(qū)別是什么”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
創(chuàng)新互聯(lián)長期為1000多家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為平昌企業(yè)提供專業(yè)的成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、外貿(mào)網(wǎng)站建設(shè),平昌網(wǎng)站改版等技術(shù)服務(wù)。擁有十年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。
1.drop與truncate與delete功能與特點(diǎn)
01.Drop的特點(diǎn)
Drop table除了在數(shù)據(jù)庫層面刪除表,還會(huì)在系統(tǒng)層面刪除xxx.ibd,xxx.frm(InnoDB表)或 xxx.MYD,xxx.MYI,xxx.frm (MyISAM)等文件;
drop table if exists table_name可以防止表不存在的報(bào)錯(cuò),但是會(huì)有一個(gè)warning;
drop table也會(huì)隱式提交,除了臨時(shí)表;
02.Truncate的特點(diǎn)
?邏輯上truncate table和delete from table_name;相似,但是過程是先drop table,然后在re-create table,如果要清空一個(gè)大表的所有數(shù)據(jù)行,truncate比delete高效;
?Truncate是一個(gè)DDL操作,一旦執(zhí)行會(huì)隱式提交,這就說明truncate無法rollback,所以執(zhí)行之前需謹(jǐn)慎
?如果表被鎖住,truncate會(huì)報(bào)錯(cuò);
?如果有外鍵約束,truncate也會(huì)報(bào)錯(cuò);
?對(duì)于InnoDB/MyISAM表的auto_increment的列,truncate table之后可以重新使用序列值;
?truncate table無法觸發(fā)delete相關(guān)的觸發(fā)器;
03.Delete的特點(diǎn)
Delete是DML操作,如果沒有提交,可以rollback;
對(duì)于InnoDB/MyISAM表的auto_increment的列,delete table之后可以無法重新使用序列值,但是重啟之后可以重新使用序列;
Delete from table_name后面一定要跟where條件,否則會(huì)刪除表的所有行;
總結(jié):
01.執(zhí)行效率:drop > truncate > delete
02.在使用drop和truncate時(shí)一定要注意,雖然可以恢復(fù),但為了減少麻煩,還是要慎重。
03.如果想刪除部分?jǐn)?shù)據(jù)用delete,注意帶上where子句,回滾段要足夠大;如果想刪除表,當(dāng)然用drop;如果想保留表而將所有數(shù)據(jù)刪除,如果和事務(wù)無關(guān),用truncate即可;如果和事務(wù)有關(guān),或者想觸發(fā)trigger,還是用delete;如果是整理表內(nèi)部的碎片,可以用truncate跟上reuse stroage,再重新導(dǎo)入/插入數(shù)據(jù)。
2.truncate與delete區(qū)別
在MySQL和oracle數(shù)據(jù)庫中delete與truncate都是可以用來對(duì)數(shù)據(jù)進(jìn)行刪除操作,但是二者又有些不同。
風(fēng)哥為大家介紹以下幾個(gè)區(qū)別:
01.truncate與delete區(qū)別一:
根據(jù)sql語言分類來說,delete屬于DML語言,也就是數(shù)據(jù)操作語言,而truncate屬于DDL語言,也就是數(shù)據(jù)定義語言。
02.truncate與delete區(qū)別二:
delete不僅可以刪除表中的數(shù)據(jù),還可以刪除基于真實(shí)表創(chuàng)建的視圖中的數(shù)據(jù)。truncate則只能刪除表中的數(shù)據(jù),不能作用于視圖。
03.truncate與delete區(qū)別三:
由于delete刪除數(shù)據(jù)涉及到事務(wù)處理,會(huì)涉及到緩存,當(dāng)數(shù)據(jù)非常大時(shí),有可能緩存不夠用,所以這時(shí)使用delete刪除數(shù)據(jù)可能達(dá)不到刪除到的目的,而且速度特別慢。當(dāng)涉及到大批量的數(shù)據(jù)時(shí),truncate就非常適合,因?yàn)樗簧婕暗骄彺?,所以速度特別快,效率也高。
04.truncate與delete區(qū)別四:
在數(shù)據(jù)庫刪除數(shù)據(jù)時(shí),delete可以根據(jù)需要進(jìn)行刪除,也就是delete可以結(jié)合where條件進(jìn)行精確的刪除某一條數(shù)據(jù),而truncate則不能支持where子句,如果作用于表,則是直接刪除表所有數(shù)據(jù)。
05.truncate與delete區(qū)別五:
delete刪除表時(shí),會(huì)涉及到事務(wù)處理,也就是可以支持事務(wù)提交,回滾。所謂事務(wù)就是支持?jǐn)?shù)據(jù)一致性,原子性,持久性,隔離性。當(dāng)使用delete刪除表數(shù)據(jù)時(shí),首先它不會(huì)真正刪除,而是會(huì)將刪除的數(shù)據(jù)放入一個(gè)緩存區(qū),可以通過回滾,從而恢復(fù)數(shù)據(jù)。但是使用truncate刪除表中數(shù)據(jù)時(shí),truncate不涉及事務(wù)處理,所以被truncate刪除的數(shù)據(jù)是不可恢復(fù)的。
06.truncate與delete區(qū)別六:
在對(duì)于一些存在關(guān)聯(lián)關(guān)系的表,使用delete刪除數(shù)據(jù)時(shí),可以運(yùn)用sql的業(yè)務(wù)邏輯順序來進(jìn)行達(dá)到刪除數(shù)據(jù)的目的。例如表A與表B存在一對(duì)多的關(guān)系,表A中id為主鍵,并且id在表B中是作為表B的外鍵。要?jiǎng)h除數(shù)據(jù),這時(shí)不能直接刪除表B,而應(yīng)該先刪除表A在進(jìn)行刪除表B,這樣就達(dá)到目的。而truncate不能刪除對(duì)于由外鍵約束的表,它達(dá)不到刪除該表的目的。
07.truncate與delete區(qū)別七:
有時(shí)候?qū)?shù)據(jù)操作可能涉及到觸發(fā)器,用delete刪除數(shù)據(jù)時(shí)則有可能會(huì)激活觸發(fā)器,進(jìn)行一些操作。而truncate是不存在觸發(fā)器的處理的。
到此,關(guān)于“drop、truncate、delete之間的區(qū)別是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!