MySQL 中 DELETE、DROP 和 TRUNCATE 的区别

在 MySQL 中,DELETEDROPTRUNCATE 都是常用于删除数据的操作,但它们在功能、性能、用途和实现方式上有所不同。下面是这三者的区别:

1. DELETE

  • 作用DELETE 用于删除表中的一行或多行数据,但不删除表结构本身。
  • 事务支持DELETE 是事务性操作,可以被回滚。
  • 触发器DELETE 会触发相关的 DELETE 触发器(如果有定义的话)。
  • 性能DELETE 操作逐行删除记录,删除过程较慢,尤其是当表中数据量较大时,因为每一行都会被逐个删除并记录日志。
  • 语法
DELETE FROM table_name WHERE condition;
  • 如果没有 WHERE 子句,将删除表中所有行,但表结构保持不变。

  • 特点

  • 删除的数据会被记录到日志中,允许回滚。

  • 删除的行数据会逐行删除,因此可能影响性能,尤其在大数据量表中。

2. DROP

  • 作用DROP 用于删除整个表(包括表结构和数据)。
  • 事务支持DROP 是不可回滚的,一旦执行就无法恢复。
  • 触发器DROP 不会触发任何触发器。
  • 性能DROP 操作删除整个表,因此是一个非常快速的操作,因为它不需要逐行删除数据。它直接删除表的元数据和数据文件。
  • 语法
DROP TABLE table_name;
  • DROP 语句会删除表结构及其中的数据,并释放表所占用的空间。

  • 特点

  • 删除的是整个表结构,所有数据会丢失,且无法恢复。

  • 不支持回滚,执行后无法撤销。

3. TRUNCATE

  • 作用TRUNCATE 用于删除表中的所有数据,但保留表结构。通常比 DELETE 更快,因为它不会逐行删除数据,而是通过删除数据页来快速清空数据。
  • 事务支持TRUNCATE 也是不可回滚的,执行后无法恢复。
  • 触发器TRUNCATE 不会触发 DELETE 触发器。
  • 性能TRUNCATE 操作通常比 DELETE 更高效,因为它不逐行删除数据,而是通过快速释放数据页来删除数据。
  • 语法
TRUNCATE TABLE table_name;
  • 删除表中的所有数据,但表结构仍然保留。

  • 特点

  • DELETE 更高效,但不支持回滚。

  • 通过删除数据页来释放数据,通常比逐行删除更快。

  • 不会触发触发器。

  • 会重置自增字段的值(如果表有自增列)。

总结表格

特性 DELETE DROP TRUNCATE
作用 删除表中的数据 删除整个表(数据和结构) 删除所有数据,保留结构
事务支持 支持事务,支持回滚 不支持事务,不可回滚 不支持事务,不可回滚
触发器 会触发触发器 不会触发触发器 不会触发触发器
性能 较慢,逐行删除 快速,直接删除整个表 快速,删除数据页
是否保留表结构 保留表结构,数据被删除 不保留,表和数据都删除 保留表结构,数据被删除
是否重置自增值 不重置自增值 重置自增值 重置自增值

选择使用的场景

  • 使用 DELETE:当你需要删除表中的部分数据,并且需要回滚操作或者触发器时,使用 DELETE
  • 使用 DROP:当你需要完全删除一个表(包括数据和结构),并且不需要保留任何信息时,使用 DROP
  • 使用 TRUNCATE:当你需要快速删除表中的所有数据,但保留表结构,且不需要回滚或触发器时,使用 TRUNCATE

通过了解这三者的不同,您可以根据需求选择最适合的操作,优化数据库管理。

MySQL 中 DELETE、DROP 和 TRUNCATE 的区别是什么?的更多相关文章

  1. MySQL中DELETE子句与TRUNCATE TABLE语句的区别

    TRUNCATE语句删除表数据的语法格式:即,table 这个词可要,可不要 TRUNCATE TABLE 表名; TRUNCATE 表名; 1,使用truncate语句后,表中的auto_incre ...

  2. Delete, drop table, truncate之间的区别

    Delete, drop table, truncate有什么区别? delete 删除表中数据,可以删除一条或多条记录,可以回滚,记录操作日记,是DML truncate table,一次性清空表中 ...

  3. MYSQL中delete删除多表数据

    MYSQL中delete删除多表数据 DELETE删除多表数据,怎样才能同时删除多个关联表的数据呢?这里做了深入的解释: 1. delete from t1 where 条件 2.delete t1 ...

  4. MySQL中实现DROP USER if EXISTS `test`,即创建新用户时检测用户是否存在

    MySQL中实现DROP USER if EXISTS `test`,即创建新用户时检测用户是否存在    版权声明:本文为博主原创文章,欢迎大家转载,注明出处即可.有问题可留言,会尽快回复,欢迎探讨 ...

  5. 请说明SQLServer中delete from tablea & truncate table tablea的区别

    请说明SQLServer中delete from tablea & truncate table tablea的区别 解答:两者都可以用来删除表中所有的记录.区别在于:truncate是DDL ...

  6. mysql中delete和truncate区别

    delete和truncate区别如下: 一.灵活性:delete可以条件删除数据,而truncate只能删除表的所有数据: delete from table_test where ... trun ...

  7. Mysql 使用delete drop truncate 删除数据时受外键约束影响解决方案

    先禁用数据库的外键约束: set foreign_key_checks=0; 进行删除操作 delete.drop.truncate 恢复数据库外键约束: set foreign_key_checks ...

  8. mysql 中delete和trncate区别

    mysql中删除表记录delete from和truncate table的用法区别: MySQL中有两种删除表中记录的方法:(1)delete from语句,(2)truncate table语句. ...

  9. MYSQL中delete删除多表数据与删除关联数据

    在mysql中删除数据方法有很多种,最常用的是使用delete来删除记录,下面我来介绍delete删除单条记 录与删除多表关联数据的一些简单实例. 1.delete from t1 where 条件 ...

  10. mysql中/*!40000 DROP DATABASE IF EXISTS `top_server`*/;这中注释有什么作用?

    需求描述: 今天在进行mysqldump实验,使用--add-drop-databases参数,于是在生成的SQL文件中,就出现了. /*!40000 DROP DATABASE IF EXISTS ...

随机推荐

  1. MySQL Event Scheduler were found damaged

    Navicat操作Mysql时报错信息:Cannot proceed because system tables used by Event Scheduler were found damaged ...

  2. Spring常用注解介绍

    在Spring中,有许多高效的注解,其简化了开发并提高代码可读性,这样我们就不用再去spring.xml文件中写标签了非常方便 创建对象的注解 在Spring,有用于识别不同类型的Bean,使得Spr ...

  3. uniapp去修改vuex中state中的值

    修改state中的值 修改state中的值,方法 (1) 在mutations中写修改state的api. (2)写好之后,直接store.commit("changeValue" ...

  4. 十. Redis 事务和 “锁机制”——> 并发秒杀处理的详细说明

    十. Redis 事务和 "锁机制"--> 并发秒杀处理的详细说明 @ 目录 十. Redis 事务和 "锁机制"--> 并发秒杀处理的详细说明 1 ...

  5. 国际“论”剑!天翼云数据库论文被EDBT收录!

    近日,由天翼云数据库团队.中国电信云计算研究院和深圳北理莫斯科大学合作完成的<Taste: Towards Practical Deep Learning-based Approaches fo ...

  6. 最佳产品奖,TeleDB拿下!

    近日,第十三届PostgreSQL技术大会在杭州举行.本次大会以"聚焦云端创新,汇聚智慧共享"为主题,行业大咖.学术精英.技术专家和技术爱好者齐聚一堂,共同探讨数据库领域的发展趋势 ...

  7. last和history 查看登录和操作命令

    last命令 last命令:用于显示用户最近登录信息.单独执行last命令,它会读取/var/log/wtmp的文件,并把该文件的内容记录的登入系统的用户名单全部显示出来. 语法 last(选项)(参 ...

  8. Project Euler 588 题解

    这玩意好像甚至有递推式--不太懂 (为什么是图片?cnblogs 第一个公式没渲染成功) 时间复杂度是 \(O(4^{\deg F}\log K)\) 的. #include<bits/stdc ...

  9. TypeError: Cannot read properties of null (reading 'level')

    一.分析问题 1.一个下拉框组件的更新由另一个下拉框组件控制被动更新列表,子级下拉框的值是由父级下拉框的值调用接口获取,每次父级下拉框值的改变都会改变子级下拉框的数据源也就是会改变子级下拉框的opti ...

  10. Python 潮流周刊#92:一张 Python 软件包的地图(摘要)

    本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...