MySQL刪除表三種操作及delete、truncate、drop語(yǔ)句的區(qū)別
本文主要講mysql中三種刪除表的操作,delete語(yǔ)句、truncate語(yǔ)句以及drop語(yǔ)句的區(qū)別
一.關(guān)聯(lián)與區(qū)別
1.區(qū)別
delete、truncate和drop是用于刪除數(shù)據(jù)庫(kù)中的數(shù)據(jù)或?qū)ο蟮腟QL語(yǔ)句,但它們有不同的功能和用法。
- delete語(yǔ)句:delete語(yǔ)句用于從表中刪除特定的行或符合特定條件的行。delete語(yǔ)句是一種有條件的刪除操作,它可以通過(guò)WHERE子句指定特定的條件來(lái)選擇要?jiǎng)h除的行。delete語(yǔ)句只能刪除數(shù)據(jù)行,而不會(huì)刪除表本身或其他對(duì)象。刪除操作通??梢曰貪L,也就是能夠撤回刪除操作并恢復(fù)被刪除的數(shù)據(jù)。
- truncate語(yǔ)句:truncate語(yǔ)句用于從表中刪除所有的行,但保留表的結(jié)構(gòu)。相比于delete,truncate是一種非??焖?、高效的操作,因?yàn)樗恍枰鹦袆h除數(shù)據(jù),而是直接將表中的數(shù)據(jù)頁(yè)清空。truncate操作不會(huì)觸發(fā)事務(wù)日志,無(wú)法回滾。因此,一旦執(zhí)行truncate操作,被刪除的數(shù)據(jù)將無(wú)法恢復(fù)。
- drop語(yǔ)句:drop語(yǔ)句用于刪除數(shù)據(jù)庫(kù)中的對(duì)象,包括表、視圖、索引等。drop語(yǔ)句是一種物理刪除,它會(huì)完全刪除指定的對(duì)象以及與該對(duì)象相關(guān)的所有數(shù)據(jù)和定義。drop操作是不可恢復(fù)的,因此在執(zhí)行drop操作之前需要特別小心,以防止誤操作導(dǎo)致數(shù)據(jù)丟失。
2.執(zhí)行速度
drop> truncate > delete
3.使用場(chǎng)景
在刪除數(shù)據(jù)庫(kù)中的數(shù)據(jù)時(shí),常常會(huì)存在這樣幾種情況:
- 已經(jīng)確定刪除整張表和數(shù)據(jù),也不需要恢復(fù)數(shù)據(jù)了,用 drop;
- 刪除數(shù)據(jù)不刪除表,但是刪除之后還有可能會(huì)后悔,用 delete;
- 只想刪除數(shù)據(jù),不用刪除表,刪除數(shù)據(jù)后不會(huì)后悔了,用 truncate;
4.表和索引所占空間:
- 當(dāng)表被truncate后,這個(gè)表和索引所占用的空間會(huì)恢復(fù)到初始大??;
- delete操作不會(huì)減少表或索引所占用的空間;
- drop語(yǔ)句將表所占用的空間全釋放掉。
5.總結(jié)
- delete 語(yǔ)句可以使用where子句實(shí)現(xiàn)部分刪除,而truncate不可以,會(huì)將表中的整個(gè)數(shù)據(jù)全部刪除,使用時(shí),可以按需求選擇;
- 如果想從表中刪除所有的數(shù)據(jù),不要使用delete,可以使用truncate語(yǔ)句,因?yàn)檫@樣執(zhí)行速度更快。truncate語(yǔ)句實(shí)際是刪除原來(lái)的表然后重新建立一個(gè)新表;
- 在沒(méi)有備份情況下,謹(jǐn)慎使用 drop 與 truncate。要?jiǎng)h除表結(jié)構(gòu)使用drop;.對(duì)于由 FOREIGN KEY 約束引用的表,不能使用 TRUNCATE TABLE,而應(yīng)使用不帶 WHERE 子句的 DELETE 語(yǔ)句。由于 TRUNCATE TABLE 不記錄在日志中,所以它不能激活觸發(fā)器。
- delete from刪空表后,會(huì)保留一個(gè)空的頁(yè),truncate在表中不會(huì)留有任何頁(yè)。
- DELETE語(yǔ)句執(zhí)行刪除的過(guò)程是每次從表中刪除一行,并且同時(shí)將該行的刪除操作作為事務(wù)記錄在日志中保存以便進(jìn)行進(jìn)行回滾操作。
- TRUNCATE TABLE 則一次性地從表中刪除所有的數(shù)據(jù)并不把單獨(dú)的刪除操作記錄記入日志保存,刪除行是不能恢復(fù)的。并且在刪除的過(guò)程中不會(huì)激活與表有關(guān)的刪除觸發(fā)器。執(zhí)行速度快。
- 當(dāng)使用行鎖執(zhí)行 DELETE 語(yǔ)句時(shí),將鎖定表中各行以便刪除。truncate始終鎖定表和頁(yè),而不是鎖定各行。
- 如果有identity產(chǎn)生的自增id列,delete from后仍然從上次的數(shù)開(kāi)始增加,即種子不變;使用truncate刪除之后,種子會(huì)恢復(fù)到初始值。
- delete刪除內(nèi)容,不刪除表結(jié)構(gòu),可以刪除全部數(shù)據(jù),也可以刪除部分?jǐn)?shù)據(jù),一行行刪除,效率較低,可以回滾。
- truncate刪除內(nèi)容,不刪除表結(jié)構(gòu),刪除表全部數(shù)據(jù),操作生效后,自動(dòng)提交,不能回滾。
- drop既刪除表內(nèi)容,又刪除表結(jié)構(gòu),執(zhí)行速度最快。
二.用法:
一.delete
1.刪除整張表的數(shù)據(jù):
delete from table_name;
2.刪除部分?jǐn)?shù)據(jù),添加where子句:
delete from table_name where...;
3.說(shuō)明
- delete可以和where子句連用刪除指定行。
- 屬于DML語(yǔ)言,每次刪除一行,都在事務(wù)日志中為所刪除的每行記錄一項(xiàng)。產(chǎn)生rollback,事務(wù)提交之后才生效;如果有相應(yīng)的 trigger,執(zhí)行的時(shí)候?qū)⒈挥|發(fā),如果刪除大數(shù)據(jù)量的表速度會(huì)很慢。
- 刪除表中數(shù)據(jù)而不刪除表的結(jié)構(gòu)(定義),同時(shí)也不釋放空間。
- delete不會(huì)刪除索引 (新插入的數(shù)據(jù)將在刪除數(shù)據(jù)的索引后繼續(xù)增加);
二.truncate
1.只能操作表,將表中數(shù)據(jù)全部刪除,在功能上和不帶where子句的delete語(yǔ)句相同:
truncate table table_name;
2.說(shuō)明
- 默認(rèn)情況下,truncate通過(guò)釋放存儲(chǔ)表數(shù)據(jù)所用的數(shù)據(jù)頁(yè)來(lái)刪除數(shù)據(jù),并且只在事務(wù)日志中記錄頁(yè)的釋放。所以使用的系統(tǒng)和事務(wù)日志資源少,可以使用reuse storage; truncate會(huì)將高水線復(fù)位(回到最開(kāi)始).
- truncate是DDL語(yǔ)言, 操作立即生效,自動(dòng)提交,原數(shù)據(jù)不放到rollback segment中,不能回滾. 操作不觸發(fā)trigger.
- 刪除內(nèi)容、釋放空間但不刪除表的結(jié)構(gòu)(定義)。
三.drop
1.drop語(yǔ)句將刪除表的結(jié)構(gòu),以及被依賴的約束(constrain),觸發(fā)器(trigger),索引(index);
drop table table_name;
2.說(shuō)明
- 刪除之后,依賴于該表的存儲(chǔ)過(guò)程/函數(shù)將保留,但是變?yōu)閕nvalid狀態(tài).
- drop也屬于DDL語(yǔ)言,立即執(zhí)行,執(zhí)行速度最快
- 刪除內(nèi)容和定義,釋放空間。
到此這篇關(guān)于MySQL刪除表三種操作(delete、truncate、drop的區(qū)別)的文章就介紹到這了,更多相關(guān)mysql delete truncate drop內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SQL如何使用正則表達(dá)式對(duì)數(shù)據(jù)進(jìn)行過(guò)濾
正則表達(dá)式的作用是匹配文本,將一個(gè)正則表達(dá)式與一個(gè)文本串進(jìn)行比較,下面這篇文章主要給大家介紹了關(guān)于SQL如何使用正則表達(dá)式對(duì)數(shù)據(jù)進(jìn)行過(guò)濾的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09
MYSQL 關(guān)于兩個(gè)經(jīng)緯度之間的距離由近及遠(yuǎn)排序
本篇文章是對(duì)MYSQL中關(guān)于兩個(gè)經(jīng)緯度之間的距離由近及遠(yuǎn)排序的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-07-07
mysql中mydumper 和 mysqldump 對(duì)比使用
MySQL數(shù)據(jù)庫(kù)備份工具有其自帶的mysqldump,屬于mysql官方的一款備份工具。但是第三方備份工具mydumper憑借優(yōu)越的特點(diǎn)為更多人所使用。下面就通過(guò)測(cè)試驗(yàn)證它們之間的備份效率。2017-05-05
解決MySQL報(bào)錯(cuò)incorrect?datetime?value?'0000-00-00?00:00
這篇文章主要給大家介紹了關(guān)于如何解決MySQL報(bào)錯(cuò)incorrect?datetime?value?'0000-00-00?00:00:00'?for?column的相關(guān)資料,文中通過(guò)代碼示例介紹的非常詳細(xì),需要的朋友可以參考下2023-08-08
MySQL存儲(chǔ)結(jié)構(gòu)用法案例分析
這篇文章主要介紹了MySQL存儲(chǔ)結(jié)構(gòu)用法,結(jié)合具體案例形式分析了mysql存儲(chǔ)結(jié)構(gòu)相關(guān)使用方法與操作注意事項(xiàng),需要的朋友可以參考下2018-07-07

