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

MySQL?中?truncate、delete、drop的區(qū)別詳解

 更新時(shí)間:2026年05月11日 09:13:48   作者:云計(jì)算  
本文詳細(xì)解析了MySQL中三種刪除方式——DELETE、TRUNCATE和DROP的核心區(qū)別,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧

DELETE、TRUNCATE、DROP 是 MySQL 中三種刪除數(shù)據(jù)的方式,核心區(qū)別如下:

對(duì)比維度DELETETRUNCATEDROP
SQL 類(lèi)型DML(數(shù)據(jù)操作語(yǔ)言)DDL(數(shù)據(jù)定義語(yǔ)言)DDL(數(shù)據(jù)定義語(yǔ)言)
刪除內(nèi)容表中的數(shù)據(jù)行表中的所有數(shù)據(jù)表結(jié)構(gòu) + 數(shù)據(jù) + 索引
WHERE 條件? 支持? 不支持? 不支持
事務(wù)回滾? 支持(需在事務(wù)中)? 不支持? 不支持
觸發(fā)器? 觸發(fā) AFTER/BEFORE? 不觸發(fā)? 不觸發(fā)
自增 ID不重置? 重置為初始值表都沒(méi)了
執(zhí)行速度慢(逐行刪除)快(直接清空)最快(直接刪除)
空間釋放不釋放,可復(fù)用? 釋放頁(yè)空間? 全部釋放
外鍵約束受約束限制需要先刪除外鍵級(jí)聯(lián)刪除

一句話總結(jié)DELETE 是逐行刪除、可回滾;TRUNCATE 是整表清空、不可回滾、重置自增;DROP 是連表帶數(shù)據(jù)一起刪除。

深度解析

一、執(zhí)行機(jī)制對(duì)比

上圖展示了三種刪除方式的執(zhí)行機(jī)制差異:

  • DELETE 逐行刪除
    • 掃描表的每一行,判斷是否滿足 WHERE 條件
    • 滿足條件的行標(biāo)記為刪除,同時(shí)寫(xiě)入 undo log 用于回滾
    • 每刪除一行都要更新索引、記錄日志
    • 執(zhí)行速度慢,但支持條件過(guò)濾和事務(wù)回滾
  • TRUNCATE 直接清空
    • 不逐行掃描,直接釋放數(shù)據(jù)頁(yè)(DROP TABLE + CREATE TABLE 的組合)
    • 重置 AUTO_INCREMENT 計(jì)數(shù)器為初始值
    • 不記錄 undo log,操作無(wú)法回滾
    • 執(zhí)行速度極快,特別適合清空大表
  • DROP 刪除整表
    • 刪除表結(jié)構(gòu)(.frm 文件)、表數(shù)據(jù)(.ibd 文件)、索引
    • 表的元數(shù)據(jù)從數(shù)據(jù)字典中移除
    • 依賴該表的視圖、存儲(chǔ)過(guò)程會(huì)失效
    • 最徹底的刪除,表完全消失

二、事務(wù)與回滾機(jī)制

關(guān)鍵差異

  • DELETE
    • 屬于 DML 操作,在事務(wù)中執(zhí)行
    • 每刪除一行都記錄 undo log,可以通過(guò) ROLLBACK 回滾
    • 回滾時(shí)根據(jù) undo log 恢復(fù)數(shù)據(jù)
  • TRUNCATE / DROP
    • 屬于 DDL 操作,執(zhí)行時(shí)會(huì)隱式提交當(dāng)前事務(wù)
    • 不記錄 undo log,操作后無(wú)法回滾
    • 即使包裹在 BEGIN ... ROLLBACK 中也無(wú)效

重要提示:生產(chǎn)環(huán)境中 TRUNCATE 和 DROP 是高危操作,執(zhí)行前務(wù)必確認(rèn)數(shù)據(jù)已備份!

三、自增 ID 處理差異

-- 測(cè)試表:當(dāng)前最大 ID 為 5
CREATE TABLE test (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50)
);
INSERT INTO test (name) VALUES ('A'), ('B'), ('C'), ('D'), ('E');
-- 此時(shí) AUTO_INCREMENT = 6
-- 場(chǎng)景一:使用 DELETE 刪除
DELETE FROM test;  -- 刪除所有數(shù)據(jù)
INSERT INTO test (name) VALUES ('F');
-- id = 6(自增 ID 不重置,繼續(xù)遞增)
-- 場(chǎng)景二:使用 TRUNCATE 刪除
TRUNCATE TABLE test;  -- 清空表
INSERT INTO test (name) VALUES ('F');
-- id = 1(自增 ID 重置為初始值)

總結(jié)

  • DELETE:不重置 AUTO_INCREMENT 計(jì)數(shù)器
  • TRUNCATE:重置 AUTO_INCREMENT 為初始值(通常是 1)

四、性能對(duì)比

性能結(jié)論

  • DELETE 最慢:需要逐行掃描、更新索引、記錄日志
  • TRUNCATE 很快:直接釋放數(shù)據(jù)頁(yè),相當(dāng)于 DROP + CREATE
  • DROP 最快:直接刪除表的元數(shù)據(jù)和文件

五、使用場(chǎng)景選擇

-- ? 場(chǎng)景一:刪除部分?jǐn)?shù)據(jù),需要條件過(guò)濾
DELETE FROM orders WHERE create_time < '2023-01-01';
-- ? 場(chǎng)景二:刪除數(shù)據(jù)后可能需要回滾
BEGIN;
DELETE FROM temp_table WHERE status = 0;
-- 檢查結(jié)果...
ROLLBACK;  -- 或者 COMMIT
-- ? 場(chǎng)景三:清空大表,重置自增 ID,不需要回滾
TRUNCATE TABLE log_table;
-- ? 場(chǎng)景四:徹底刪除表(包括結(jié)構(gòu)和數(shù)據(jù))
DROP TABLE deprecated_table;
-- ? 場(chǎng)景五:刪除表但保留表結(jié)構(gòu)
TRUNCATE TABLE user_temp;  -- 推薦
-- 或者
DELETE FROM user_temp;     -- 如果需要回滾

六、安全操作建議

-- ? 危險(xiǎn)操作:生產(chǎn)環(huán)境禁止直接執(zhí)行
TRUNCATE TABLE orders;     -- 數(shù)據(jù)無(wú)法恢復(fù)!
DROP TABLE users;          -- 表直接沒(méi)了!
-- ? 安全操作:先備份再刪除
-- 步驟 1:創(chuàng)建備份表
CREATE TABLE orders_backup_20240101 AS SELECT * FROM orders;
-- 步驟 2:確認(rèn)備份無(wú)誤
SELECT COUNT(*) FROM orders_backup_20240101;
-- 步驟 3:執(zhí)行刪除
TRUNCATE TABLE orders;
-- ? 更安全的做法:使用事務(wù) + DELETE(小數(shù)據(jù)量)
BEGIN;
DELETE FROM orders WHERE create_time < '2023-01-01';
-- 檢查影響行數(shù)
SELECT ROW_COUNT();
-- 確認(rèn)無(wú)誤后提交
COMMIT;
-- 或者回滾
ROLLBACK;

面試高頻追問(wèn)

  • TRUNCATE 為什么比 DELETE 快?
    • TRUNCATE 是 DDL,直接釋放數(shù)據(jù)頁(yè),不逐行刪除
    • 不記錄每行的 undo log,日志量極少
    • 不觸發(fā)行級(jí)觸發(fā)器,不需要更新每行的索引
    • 相當(dāng)于 DROP TABLE + CREATE TABLE 的組合
  • DELETE 全表后空間會(huì)釋放嗎?
    • 不會(huì)立即釋放,只是標(biāo)記為 "可復(fù)用"
    • 空間留給后續(xù)的 INSERT 使用
    • 如需釋放空間,可執(zhí)行 OPTIMIZE TABLE 或 ALTER TABLE ... ENGINE=InnoDB
  • 如何恢復(fù)被 TRUNCATE 的數(shù)據(jù)?
    • 正常情況下無(wú)法恢復(fù)(沒(méi)有 undo log
    • 只能通過(guò)備份恢復(fù)(全量備份 + binlog 增量)
    • 所以生產(chǎn)環(huán)境執(zhí)行前務(wù)必確認(rèn)有備份
  • DELETE 會(huì)觸發(fā)觸發(fā)器嗎?
    • 會(huì)觸發(fā) BEFORE DELETE 和 AFTER DELETE 觸發(fā)器
    • TRUNCATE 不會(huì)觸發(fā)任何觸發(fā)器
    • 這也是 TRUNCATE 更快的原因之一

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

相關(guān)文章

  • 一文詳解MySQL表的約束

    一文詳解MySQL表的約束

    本文聚焦數(shù)據(jù)庫(kù)表設(shè)計(jì)核心要素,涵蓋空屬性、默認(rèn)值等基礎(chǔ)設(shè)置,詳解主鍵、自增長(zhǎng)、唯一鍵、外鍵的定義與操作,通過(guò)商品、客戶、購(gòu)買(mǎi)表案例,展現(xiàn)其實(shí)際應(yīng)用邏輯,對(duì)mysql表約束相關(guān)知識(shí)感興趣的朋友跟隨小編一起看看吧
    2025-10-10
  • MySQL學(xué)習(xí)必備條件查詢數(shù)據(jù)

    MySQL學(xué)習(xí)必備條件查詢數(shù)據(jù)

    這篇文章主要介紹了MySQL學(xué)習(xí)必備條件查詢數(shù)據(jù),首先通過(guò)利用where語(yǔ)句可以對(duì)數(shù)據(jù)進(jìn)行篩選展開(kāi)主題相關(guān)內(nèi)容,具有一定的參考價(jià)值,需要的小伙伴可以參考一下,希望對(duì)你有所幫助
    2022-03-03
  • MySQL使用GROUP BY分組查詢

    MySQL使用GROUP BY分組查詢

    GROUP BY關(guān)鍵字可以根據(jù)一個(gè)或多個(gè)字段對(duì)查詢結(jié)果進(jìn)行分組,本文主要介紹了MySQL使用GROUP BY分組查詢,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-08-08
  • MySQL中處理各種重復(fù)的一些方法

    MySQL中處理各種重復(fù)的一些方法

    這篇文章主要介紹了MySQL中處理各種重復(fù)的一些方法,包括對(duì)表和查詢結(jié)果的重復(fù)的一些處理,需要的朋友可以參考下
    2015-05-05
  • Mysql文件存儲(chǔ)圖文詳解

    Mysql文件存儲(chǔ)圖文詳解

    文件存儲(chǔ)是我們?nèi)粘i_(kāi)發(fā)中經(jīng)常遇到的一個(gè)功能,下面這篇文章主要給大家介紹了關(guān)于Mysql文件存儲(chǔ)的相關(guān)資料,需要的朋友可以參考下
    2021-06-06
  • macOS下mysql 8.0.16 安裝配置圖文教程

    macOS下mysql 8.0.16 安裝配置圖文教程

    這篇文章主要為大家詳細(xì)介紹了macOS下mysql 8.0.16 安裝配置圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • 通過(guò)線上故障帶你看懂?MySQL?InnoDB?緩沖池

    通過(guò)線上故障帶你看懂?MySQL?InnoDB?緩沖池

    文章主要講解了線上數(shù)據(jù)庫(kù)出現(xiàn)卡頓問(wèn)題的排查過(guò)程,定位到InnoDB緩沖池失效,導(dǎo)致大量冷數(shù)據(jù)沖擊緩存、熱數(shù)據(jù)被擠掉,從而進(jìn)入緩存失效-磁盤(pán)IO暴漲-查詢變慢-連接堆積的惡性循環(huán),同時(shí),需要合理配置緩沖池大小、避免全表掃描、控制臟頁(yè)比例等
    2026-05-05
  • MySQL數(shù)據(jù)庫(kù)遷移OpenGauss數(shù)據(jù)庫(kù)解析

    MySQL數(shù)據(jù)庫(kù)遷移OpenGauss數(shù)據(jù)庫(kù)解析

    這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)遷移OpenGauss數(shù)據(jù)庫(kù)解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • 淺談sql語(yǔ)句中GROUP BY 和 HAVING的使用方法

    淺談sql語(yǔ)句中GROUP BY 和 HAVING的使用方法

    GROUP BY語(yǔ)句和HAVING語(yǔ)句,經(jīng)過(guò)研究和練習(xí),終于明白如何使用了,在此記錄一下同時(shí)添加了一個(gè)自己舉的小例子,通過(guò)寫(xiě)這篇文章來(lái)加深下自己學(xué)習(xí)的效果,還能和大家分享下,同時(shí)也方便以后查閱,一舉多得,下面由小編來(lái)和大家一起學(xué)習(xí)
    2019-05-05
  • MYSQL數(shù)據(jù)庫(kù)連接池及常見(jiàn)參數(shù)調(diào)優(yōu)方式

    MYSQL數(shù)據(jù)庫(kù)連接池及常見(jiàn)參數(shù)調(diào)優(yōu)方式

    這篇文章主要介紹了MYSQL數(shù)據(jù)庫(kù)連接池及常見(jiàn)參數(shù)調(diào)優(yōu)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06

最新評(píng)論

大姚县| 云和县| 金寨县| 禄丰县| 嘉峪关市| 连江县| 阿城市| 潍坊市| 台南县| 霞浦县| 青海省| 建瓯市| 崇左市| 朝阳县| 青田县| 福建省| 南华县| 道真| 永寿县| 新泰市| 潼南县| 甘肃省| 屯昌县| 宁乡县| 南华县| 奈曼旗| 关岭| 通河县| 永平县| 电白县| 淳化县| 湄潭县| 黔西| 盖州市| 鹤壁市| 潼南县| 新乐市| 舒城县| 扎鲁特旗| 宁海县| 托克托县|