欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL中drop、truncate和delete的區(qū)別小結(jié)

 更新時(shí)間:2024年04月18日 10:11:38   作者:LeoToJavaer  
在MySQL數(shù)據(jù)庫(kù)管理中,常常需要執(zhí)行刪除數(shù)據(jù)的操作,本文主要介紹了MySQL中drop、truncate和delete的區(qū)別小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下

1.前言

對(duì)于drop、truncate和delete,雖然簡(jiǎn)單,但是真要使用或者面試時(shí)候問(wèn)到還是需要有一定的總結(jié),今天來(lái)簡(jiǎn)單講講他們直接的區(qū)別。在此之前先簡(jiǎn)單了解下什么是DDL和DML。

  • DDL(數(shù)據(jù)定義語(yǔ)言,Data Definition Language):DDL代表數(shù)據(jù)定義語(yǔ)言,是一種有助于創(chuàng)建數(shù)據(jù)庫(kù)模式的SQL命令。DDL中常用的命令有:create,drop,alter,truncaterename等等。
  • DML(數(shù)據(jù)操作語(yǔ)言,Data Manipulation Language):DML代表數(shù)據(jù)操作語(yǔ)言,是一種有助于檢索和管理關(guān)系數(shù)據(jù)庫(kù)中數(shù)據(jù)的SQL命令。DML中常用的命令有:insert,update,deleteselect等等。

2.drop

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

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

代碼示例:

DROP TABLE employees;

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

3.truncate

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

  • 快速清空表TRUNCATE比使用DELETE刪除表中的所有行要快得多,因?yàn)樗恢鹦袆h除數(shù)據(jù),而是通過(guò)釋放存儲(chǔ)這些數(shù)據(jù)的數(shù)據(jù)頁(yè)來(lái)刪除數(shù)據(jù)并重新初始化表。

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

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

  • 自動(dòng)重置自增ID:對(duì)于有自增主鍵的表,TRUNCATE會(huì)重置自增計(jì)數(shù)器。

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

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

示例:

TRUNCATE TABLE employees;

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

4.delete

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

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

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

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

  • 性能:因?yàn)?code>DELETE操作逐行刪除數(shù)據(jù),并記錄日志,所以在刪除大量數(shù)據(jù)時(shí)可能會(huì)比較慢。

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

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

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

示例:

DELETE FROM employees WHERE department = 'Sales';

5.總結(jié)

在速度上,一般來(lái)說(shuō),drop> truncate > delete。

  • 如果想刪除部分?jǐn)?shù)據(jù)用delete,注意帶上where子句,回滾段要足夠大;如果想刪除表,當(dāng)然用drop;
  • 如果想保留表而將所有數(shù)據(jù)刪除,如果和事務(wù)無(wú)關(guān)(不能回滾),用truncate即可;
  • 如果和事務(wù)有關(guān),或者想觸發(fā)trigger,還是用delete;
  • 如果是整理表內(nèi)部的碎片,可以用truncate跟上reuse stroage,再重新導(dǎo)入/插入數(shù)據(jù)。
  • truncate與drop是DDL語(yǔ)句,執(zhí)行后無(wú)法回滾;delete是DML語(yǔ)句,可回滾。
  • truncate只能作用于表;delete,drop可作用于表、視圖等。
  • truncate會(huì)清空表中的所有行,但表結(jié)構(gòu)及其約束、索引等保持不變;drop會(huì)刪除表的結(jié)構(gòu)及其所依賴(lài)的約束、索引等。
  • truncate會(huì)重置表的自增值;delete不會(huì)。
  • truncate不會(huì)激活與表有關(guān)的刪除觸發(fā)器;delete可以。
  • truncate后會(huì)使表和索引所占用的空間會(huì)恢復(fù)到初始大小;delete操作不會(huì)減少表或索引所占用的空間,drop語(yǔ)句將表所占用的空間全釋放掉。

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

相關(guān)文章

  • 解決Eclipse Tomcat OutOfMemoryError:PermGen space的問(wèn)題

    解決Eclipse Tomcat OutOfMemoryError:PermGen space的問(wèn)題

    今天小編就為大家分享一篇關(guān)于解決Eclipse Tomcat OutOfMemoryError:PermGen space的問(wèn)題,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12
  • JavaWeb中導(dǎo)出excel文件的簡(jiǎn)單方法

    JavaWeb中導(dǎo)出excel文件的簡(jiǎn)單方法

    下面小編就為大家?guī)?lái)一篇JavaWeb中導(dǎo)出excel文件的簡(jiǎn)單方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-10-10
  • SpringBoot實(shí)現(xiàn)自定義Redis的連接的流程步驟

    SpringBoot實(shí)現(xiàn)自定義Redis的連接的流程步驟

    Spring Boot 自定義 Redis 主要是指在基于 Spring Boot 的應(yīng)用程序中,當(dāng)你需要更深入地控制或擴(kuò)展對(duì) Redis 數(shù)據(jù)庫(kù)的操作,而不是僅僅依賴(lài) Spring Data Redis 的默認(rèn)配置,本文給大家介紹了SpringBoot實(shí)現(xiàn)自定義Redis的連接的流程步驟,需要的朋友可以參考下
    2024-09-09
  • Java 多層嵌套JSON類(lèi)型數(shù)據(jù)全面解析

    Java 多層嵌套JSON類(lèi)型數(shù)據(jù)全面解析

    這篇文章主要介紹了Java 多層嵌套JSON類(lèi)型數(shù)據(jù)全面解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • SpringMVC 參數(shù)綁定意義及實(shí)現(xiàn)過(guò)程解析

    SpringMVC 參數(shù)綁定意義及實(shí)現(xiàn)過(guò)程解析

    這篇文章主要介紹了SpringMVC 參數(shù)綁定意義及實(shí)現(xiàn)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • SpringBoot模擬員工數(shù)據(jù)庫(kù)并實(shí)現(xiàn)增刪改查操作

    SpringBoot模擬員工數(shù)據(jù)庫(kù)并實(shí)現(xiàn)增刪改查操作

    這篇文章主要給大家介紹了關(guān)于SpringBoot模擬員工數(shù)據(jù)庫(kù)并實(shí)現(xiàn)增刪改查操作的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2021-09-09
  • Java中的String不可變性實(shí)現(xiàn)

    Java中的String不可變性實(shí)現(xiàn)

    在Java編程中,String類(lèi)的不可變性是一個(gè)被廣泛討論和利用的特性,本文主要介紹了Java中的String不可變性實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • 常用的Spring Boot調(diào)用外部接口方式實(shí)現(xiàn)數(shù)據(jù)交互

    常用的Spring Boot調(diào)用外部接口方式實(shí)現(xiàn)數(shù)據(jù)交互

    Spring Boot提供了多種調(diào)用外部接口的方式,可以方便地實(shí)現(xiàn)與其他系統(tǒng)的數(shù)據(jù)交互,提高系統(tǒng)的可擴(kuò)展性和數(shù)據(jù)共享能力,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2023-04-04
  • Java網(wǎng)絡(luò)編程基礎(chǔ)篇之單向通信

    Java網(wǎng)絡(luò)編程基礎(chǔ)篇之單向通信

    這篇文章主要介紹了Java網(wǎng)絡(luò)編程里通過(guò)套接字實(shí)現(xiàn)單向通信的方法及相關(guān)實(shí)例,屬于網(wǎng)絡(luò)編程入門(mén)程序,雖然簡(jiǎn)單,但具有一定參考價(jià)值,需要的朋友可以參考下。
    2017-09-09
  • springboot自定義配置及自定義對(duì)象映射的全流程

    springboot自定義配置及自定義對(duì)象映射的全流程

    這篇文章主要介紹了springboot自定義配置及自定義對(duì)象映射的全流程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10

最新評(píng)論