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

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

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

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

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

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

深度解析

一、執(zhí)行機制對比

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

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

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

關(guān)鍵差異

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

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

三、自增 ID 處理差異

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

總結(jié)

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

四、性能對比

性能結(jié)論

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

五、使用場景選擇

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

六、安全操作建議

-- ? 危險操作:生產(chǎn)環(huán)境禁止直接執(zhí)行
TRUNCATE TABLE orders;     -- 數(shù)據(jù)無法恢復(fù)!
DROP TABLE users;          -- 表直接沒了!
-- ? 安全操作:先備份再刪除
-- 步驟 1:創(chuàng)建備份表
CREATE TABLE orders_backup_20240101 AS SELECT * FROM orders;
-- 步驟 2:確認備份無誤
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();
-- 確認無誤后提交
COMMIT;
-- 或者回滾
ROLLBACK;

面試高頻追問

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

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

相關(guān)文章

  • 一文詳解MySQL表的約束

    一文詳解MySQL表的約束

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

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

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

    MySQL使用GROUP BY分組查詢

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

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

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

    Mysql文件存儲圖文詳解

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

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

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

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

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

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

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

    淺談sql語句中GROUP BY 和 HAVING的使用方法

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

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

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

最新評論

岳阳县| 贵定县| 东港市| 习水县| 宁远县| 灵寿县| 蓬安县| 瑞丽市| 哈密市| 邵阳县| 闽清县| 通道| 白城市| 上饶县| 平乡县| 加查县| 茌平县| 自贡市| 安新县| 韩城市| 斗六市| 德惠市| 西盟| 浏阳市| 枞阳县| 长武县| 霍城县| 天峻县| 乌鲁木齐市| 阳曲县| 涿州市| 拉萨市| 射洪县| 通许县| 徐汇区| 彰化县| 呼图壁县| 南安市| 湘西| 安乡县| 固镇县|