最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談MySQL中drop、truncate和delete的區(qū)別

 更新時間:2025年05月02日 10:29:08   作者:geocodingcoder  
在MySQL中,drop、delete和truncate是用來刪除表中數(shù)據(jù)或整個表的命令,本文主要介紹了MySQL中drop、truncate和delete的區(qū)別,具有一定的參考價值,感興趣的可以了解一下

1.前言

對于drop、truncate和delete,雖然簡單,但是真要使用或者面試時候問到還是需要有一定的總結(jié),今天來簡單講講他們直接的區(qū)別。在此之前先簡單了解下什么是DDL和DML。
DDL(數(shù)據(jù)定義語言,Data Definition Language):DDL代表數(shù)據(jù)定義語言,是一種有助于創(chuàng)建數(shù)據(jù)庫模式的SQL命令。DDL中常用的命令有:create,drop,alter,truncaterename等等。
DML(數(shù)據(jù)操作語言,Data Manipulation Language):DML代表數(shù)據(jù)操作語言,是一種有助于檢索和管理關(guān)系數(shù)據(jù)庫中數(shù)據(jù)的SQL命令。DML中常用的命令有:insert,update,deleteselect等等。

2.drop

DROP命令用于刪除整個表(結(jié)構(gòu)和數(shù)據(jù)),或數(shù)據(jù)庫等對象,特點(diǎn)如下:

  • 徹底刪除DROP命令不僅刪除表內(nèi)的所有數(shù)據(jù),還刪除了表的結(jié)構(gòu)定義。這個過程是不可逆的,除非有備份可以恢復(fù)。
  • 釋放資源:執(zhí)行DROP命令后,與該表相關(guān)的數(shù)據(jù)庫資源會被釋放。
  • 非事務(wù)性操作DROP操作通常不能回滾,執(zhí)行DROP命令后,相關(guān)對象就被立即刪除。
  • 自增ID:如果創(chuàng)建新表,自增ID會重新開始計數(shù)。

代碼示例:

DROP TABLE employees;

注意:DROP語句執(zhí)行后立即生效,無法找回。

3.truncate

TRUNCATE命令用于刪除表中的所有行,其特點(diǎn)如下:

  • 快速清空表TRUNCATE比使用DELETE刪除表中的所有行要快得多,因為它不逐行刪除數(shù)據(jù),而是通過釋放存儲這些數(shù)據(jù)的數(shù)據(jù)頁來刪除數(shù)據(jù)并重新初始化表。

  • 非事務(wù)性操作:盡管某些數(shù)據(jù)庫管理系統(tǒng)可能允許TRUNCATE操作在事務(wù)中回滾,但在很多情況下,TRUNCATE并不記錄詳細(xì)的日志,因此不能像DELETE操作那樣保證事務(wù)安全。

  • 不觸發(fā)觸發(fā)器:通常,執(zhí)行TRUNCATE操作不會觸發(fā)表的觸發(fā)器。

  • 自動重置自增ID:對于有自增主鍵的表,TRUNCATE會重置自增計數(shù)器。

truncate會刪除表中所有記錄,并且將重新設(shè)置高水線和所有的索引。

就是truncate會刪除表中的所有行,但表結(jié)構(gòu)及其列、約束、索引等保持不變。新行標(biāo)識所用的計數(shù)值重置為該列的種子),缺省情況下將空間釋放到minextents的extent(就是表結(jié)構(gòu)中的段內(nèi)的區(qū)域),除非使用reuse storage(使用這句話,所在的extent空間不會被回收,只是將數(shù)據(jù)刪除掉,數(shù)據(jù)刪除之后的freespace空間,只能供本表使用,其他的不可以使用)。不會記錄日志,所以執(zhí)行速度很快,但不能通過rollback撤消操作(如果一不小心把一個表truncate掉,也是可以恢復(fù)的,只是不能通過rollback來恢復(fù)

示例:

TRUNCATE TABLE employees;

注意:TRUNCATE語句執(zhí)行后立即生效,無法找回。

4.delete

DELETE命令用于刪除表中的一行或多行記錄,具有如下特點(diǎn):

選擇性刪除:可以通過WHERE子句指定刪除哪些行。若不指定WHERE子句,則刪除表中的所有行。

事務(wù)性操作DELETE操作是事務(wù)安全的,這意味著你可以在一個事務(wù)中回滾DELETE操作。這在你意外刪除了錯誤數(shù)據(jù)時非常有用。

觸發(fā)器:如果表上有觸發(fā)器,執(zhí)行DELETE操作會觸發(fā)它們。

性能:因為DELETE操作逐行刪除數(shù)據(jù),并記錄日志,所以在刪除大量數(shù)據(jù)時可能會比較慢。

  • delete語句不影響表所占用的extent(就是表結(jié)構(gòu)的中的區(qū)),高水線(high watermark)保持原位置不變。 (高水位線就存在于段(segment)中,它用于標(biāo)識段中已使用過的數(shù)據(jù)塊與未使用的數(shù)據(jù)塊二者間交界,掃描表數(shù)據(jù)的時候,高水位線以下的所有數(shù)據(jù)塊都必須被掃描。)

  • 在 InnoDB 中,delete其實并不會真的把數(shù)據(jù)刪除,mysql 實際上只是給刪除的數(shù)據(jù)打了個標(biāo)記為已刪除,因此 delete 刪除表中的數(shù)據(jù)時,表文件在磁盤上所占空間不會變小,存儲空間不會被釋放,只是把刪除的數(shù)據(jù)行設(shè)置為不可見。雖然未釋放磁盤空間,但是下次插入數(shù)據(jù)的時候,仍然可以重用這部分空間(重用 → 覆蓋)。

  • delete執(zhí)行時,會先將所刪除數(shù)據(jù)緩存到rollback segement中,事務(wù)commit之后生效;delete from table_name刪除表的全部數(shù)據(jù),對于MyISAM 會立刻釋放磁盤空間,InnoDB 不會釋放磁盤空間;
    對于delete from table_name where xxx帶條件的刪除, 不管是InnoDB還是MyISAM都不會釋放磁盤空間;
    delete操作以后使用 optimize table table_name則會立刻釋放磁盤空間。不管是InnoDB還是MyISAM 。所以要想達(dá)到釋放磁盤空間的目的,delete以后執(zhí)行optimize table操作。

示例:

DELETE FROM employees WHERE department = 'Sales';

5.總結(jié)

在速度上,一般來說,drop> truncate > delete

  • 如果想刪除部分?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ù)。
  • truncate與drop是DDL語句,執(zhí)行后無法回滾;delete是DML語句,可回滾。
  • truncate只能作用于表;delete,drop可作用于表、視圖等。
  • truncate會清空表中的所有行,但表結(jié)構(gòu)及其約束、索引等保持不變;drop會刪除表的結(jié)構(gòu)及其所依賴的約束、索引等。
  • truncate會重置表的自增值;delete不會。
  • truncate不會激活與表有關(guān)的刪除觸發(fā)器;delete可以。
  • truncate后會使表和索引所占用的空間會恢復(fù)到初始大小;delete操作不會減少表或索引所占用的空間,drop語句將表所占用的空間全釋放掉。

 到此這篇關(guān)于淺談MySQL中drop、truncate和delete的區(qū)別的文章就介紹到這了,更多相關(guān)MySQL drop truncate delete內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • IDEA連接mysql又報錯!Server returns invalid timezone. Go to tab and set serverTimezone  prope的問題

    IDEA連接mysql又報錯!Server returns invalid timezone. Go to tab an

    這篇文章主要介紹了IDEA連接mysql又報錯!Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezone' prope問題,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2020-05-05
  • 你有沒有遺忘mysql的歷史記錄

    你有沒有遺忘mysql的歷史記錄

    程序出現(xiàn)了問題,明知道可能是sql語句造成的,但是因為框架的原因,分析起來十分麻煩,于是打算直接查看數(shù)據(jù)庫里面的歷史記錄.
    2014-09-09
  • MySQL 5.7 版本的安裝及簡單使用(圖文教程)

    MySQL 5.7 版本的安裝及簡單使用(圖文教程)

    這篇文章主要介紹了MySQL 5.7 版本的安裝及簡單使用(圖文教程)的相關(guān)資料,這里對mysql 5.7的安裝及使用和注意事項,需要的朋友可以參考下
    2016-12-12
  • MySQL 數(shù)據(jù)庫表的操作實戰(zhàn)案例

    MySQL 數(shù)據(jù)庫表的操作實戰(zhàn)案例

    MySQL表是數(shù)據(jù)存儲的核心容器,掌握表的創(chuàng)建、查看、修改、刪除是數(shù)據(jù)庫開發(fā)必備技能,本文結(jié)合實戰(zhàn)案例,帶你系統(tǒng)學(xué)習(xí)MySQL表的所有基礎(chǔ)操作,小白也能快速上手,感興趣的朋友一起看看吧
    2026-05-05
  • Oracle和MySQL的高可用方案對比分析

    Oracle和MySQL的高可用方案對比分析

    這篇文章主要介紹了Oracle和MySQL的高可用方案對比分析,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-11-11
  • MySQL中使用正則表達(dá)式詳情

    MySQL中使用正則表達(dá)式詳情

    這牌你文章主要給大家分享的是MySQL中使用正則表達(dá)式詳情,MySQL中支持正則表達(dá)式匹配,在復(fù)雜的過濾條件中,可以考慮使用正則表達(dá)式。使用正則表達(dá)式需要掌握一些正則表達(dá)式的語法和指令,下面來看看文章的詳細(xì)內(nèi)容介紹吧,希望對你有所幫助
    2021-11-11
  • 解決大于5.7版本mysql的分組報錯Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated

    解決大于5.7版本mysql的分組報錯Expression #1 of SELECT list is not in GR

    這篇文章主要介紹了解決大于5.7版本mysql的分組報錯Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated問題,需要的朋友可以參考下
    2019-10-10
  • 創(chuàng)建mysql表分區(qū)的方法

    創(chuàng)建mysql表分區(qū)的方法

    我來給大家介紹一下mysql表分區(qū)創(chuàng)建與使用吧,希望對各位同學(xué)會有所幫助。表分區(qū)的測試使用,主要內(nèi)容來自于其他博客文章以及mysql5.1的參考手冊。
    2013-10-10
  • Mysql超詳細(xì)講解死鎖問題的理解

    Mysql超詳細(xì)講解死鎖問題的理解

    又到了金三銀四的時候,大家都按耐不住內(nèi)心的躁動,我在這里給大家分享下之前面試中遇到的一個知識點(diǎn)(死鎖問題),如有不足,歡迎大佬們指點(diǎn)指點(diǎn)
    2022-03-03
  • Mysql提升索引效率優(yōu)化的八種方法總結(jié)

    Mysql提升索引效率優(yōu)化的八種方法總結(jié)

    索引實際上也是一張表,保存了主鍵和索引的字段,并且指向?qū)嶓w表的記錄,所以索引也是需要占用空間的,這篇文章主要給大家介紹了關(guān)于Mysql提升索引效率優(yōu)化的八種方法,需要的朋友可以參考下
    2024-04-04

最新評論

云阳县| 彰化市| 常州市| 黔江区| 花莲县| 四平市| 鸡东县| 淮北市| 太康县| 葵青区| 东乡| 墨脱县| 南城县| 寿光市| 安化县| 钟祥市| 化德县| 黑水县| 萍乡市| 唐山市| 西乡县| 祥云县| 武山县| 高清| 新兴县| 门头沟区| 潜江市| 福泉市| 宁城县| 新竹市| 文昌市| 抚远县| 武胜县| 铜陵市| 广东省| 信阳市| 贡嘎县| 大同县| 探索| 白水县| 上虞市|