SQL之delete、truncate和drop区别

MySQL删除数据的方式都有哪些?

常用的三种删除方式:通过 delete、truncate、drop 关键字进行删除;这三种都可以用来删除数据,但场景不同。

一、从执行速度上来说

复制代码
drop > truncate >> DELETE;

二、从原理上讲

1、DELETE

复制代码
DELETE from TABLE_NAME where xxx

1、DELETE属于数据库DML操作语言,只删除数据不删除表的结构,会走事务,执行时会触发trigger;

2、在 InnoDB 中,DELETE其实并不会真的把数据删除,mysql 实际上只是给删除的数据打了个标记为已删除,因此 delete 删除表中的数据时,表文件在磁盘上所占空间不会变小,存储空间不会被释放,只是把删除的数据行设置为不可见。 虽然未释放磁盘空间,但是下次插入数据的时候,仍然可以重用这部分空间(重用 → 覆盖)。

3、 DELETE执行时,会先将所删除数据缓存到rollback segement中,事务commit之后生效;

4、 delete from table_name删除表的全部数据,对于MyISAM 会立刻释放磁盘空间,InnoDB 不会释放磁盘空间;

5、对于delete from table_name where xxx 带条件的删除, 不管是InnoDB还是MyISAM都不会释放磁盘空间;

6、 delete操作以后使用 optimize table table_name 会立刻释放磁盘空间。不管是InnoDB还是MyISAM 。所以要想达到释放磁盘空间的目的,delete以后执行optimize table 操作。

复制代码
示例:查看表占用硬盘空间大小的SQL语句如下:(用M做展示单位,数据库名:csjdemo,表名:demo2)

select concat(round(sum(DATA_LENGTH/1024/1024),2),'M') as table_size
   from information_schema.tables
      where table_schema='csjdemo' AND table_name='demo2';

然后执行空间优化语句,以及执行后的表Size变化:

7、delete 操作是一行一行执行删除的,并且同时将该行的的删除操作日志记录在redo和undo表空间中以便进行回滚(rollback)和重做操作,生成的大量日志也会占用磁盘空间。

2、truncate

复制代码
Truncate table TABLE_NAME

2.1、truncate:属于数据库DDL定义语言,不走事务,原数据不放到 rollback segment 中,操作不触发 trigger。

执行后立即生效,无法找回

执行后立即生效,无法找回

执行后立即生效,无法找回

2.2、truncate table table_name 立刻释放磁盘空间 ,不管是 InnoDB和MyISAM 。truncate table其实有点类似于drop table 然后creat,只不过这个create table 的过程做了优化,比如表结构文件之前已经有了等等。所以速度上应该是接近drop table的速度;

2.3、truncate能够快速清空一个表。并且重置auto_increment的值。

但对于不同的类型存储引擎需要注意的地方是:

对于MyISAM,truncate会重置auto_increment(自增序列)的值为1。而delete后表仍然保持auto_increment。

对于InnoDB,truncate会重置auto_increment的值为1。delete后表仍然保持auto_increment。但是在做delete整个表之后重启MySQL的话,则重启后的auto_increment会被置为1。

也就是说,InnoDB的表本身是无法持久保存auto_increment。delete表之后auto_increment仍然保存在内存,但是重启后就丢失了,只能从1开始。实质上重启后的auto_increment会从 SELECT 1+MAX(ai_col) FROM t 开始。

2.4、小心使用 truncate,尤其没有备份的时候,注意别误删除线上的表

3、drop

复制代码
Drop table Tablename

3.1、drop:属于数据库DDL定义语言,同Truncate;

执行后立即生效,无法找回

执行后立即生效,无法找回

执行后立即生效,无法找回

3.2、drop table table_name 立刻释放磁盘空间 ,不管是 InnoDB 和 MyISAM; drop 语句将删除表的结构被依赖的约束(constrain)、触发器(trigger)、索引(index); 依赖于该表的存储过程/函数将保留,但是变为 invalid 状态。

3.3、小心使用 drop :可以这么理解,一本书,delete是把目录撕了,truncate是把书的内容撕下来烧了,drop是把书烧了

三、总结

相同点:

1、都有删除表的功能;

不同点:

1、delete、truncate仅仅删除表里面的数据;drop会把表的结构也删除掉

2、delete是DML语句,操作完了,还可以回滚;truncate和drop是DDL语句,删除之后立即生效,不能回滚;

3、在执行效益上drop>truncate>delete;

扩展知识:

为了形成数据库语言,DDL和DML都是必须的。DDL和DML之间的主要区别在于:DDL有助于更改数据库的结构,而DML有助于管理数据库中的数据。

1、DML语句:

(1)DML代表数据操作语言,是一种有助于检索和管理关系数据库中数据的SQL命令;会影响表中的一个或多个记录;可以回滚;

(2)常用的DML语句:insert,update,delete,select等等;

1、DDL语句:

(1)DDL代表数据定义语言,是一种有助于创建数据库模式的SQL命令;会影响整个数据库或者表,不可以回滚;

(2)常用的DDL语句:create,drop,alter,truncate和rename等等;

  • delete pk TRUNCATE

1.DELETE 可以加where 条件,truncate 不能加

2.truncate删除,效率高一些

3.假如要删除的表中有自增长列,如果用delete 删除后,再插入数据,自增长列的值从断点开始,而truncate删除后,再插入数据,自增长列的值从1开始

4.truncate删除后没有返回值,delete 删除有返回值

5.truncate 删除后不能回滚,delete 删除可以回滚

即:

在SQL中,DELETETRUNCATEDROP 都是用来删除数据或表的命令,但它们之间有一些关键的区别:

  1. DELETE

    • DELETE 用于删除表中的行。
    • 它是一个DML(数据操作语言)命令。
    • DELETE 操作会逐行删除数据,并且这个过程可以被回滚。
    • DELETE 操作会触发与行相关的删除触发器。
    • DELETE 操作不会重置表的自增计数器(如果有的话)。
    • DELETE 操作会更新相关的索引,这可能会比 TRUNCATE 操作慢,特别是当表中有大量数据时。
    • DELETE 操作可以指定条件,只删除满足条件的行。
  2. TRUNCATE

    • TRUNCATE 用于快速删除表中的所有行,包括表中的所有行和系统表中关于该表的信息。
    • 它是一个DDL(数据定义语言)命令。
    • TRUNCATE 操作不会逐行删除数据,而是直接删除表并重新创建,这个过程不能被回滚。
    • TRUNCATE 操作不会触发与行相关的删除触发器。
    • TRUNCATE 操作会重置表的自增计数器(如果有的话)。
    • TRUNCATE 操作通常比 DELETE 快,因为它不更新索引,而是删除整个表结构并重新创建。
    • TRUNCATE 操作不能指定条件,它会删除表中的所有行。
  3. DROP

    • DROP 用于删除数据库中的表或其它数据库对象(如视图、索引、触发器等)。
    • 它是一个DDL命令。
    • DROP 操作会完全删除表结构及其定义,包括表中的所有数据、索引、触发器等。
    • DROP 操作不能被回滚。
    • DROP 操作不会触发与表相关的任何触发器。
    • DROP 操作会释放表所占用的空间。
    • DROP 操作可以指定条件,但通常用于无条件地删除对象。

总结来说,DELETE 用于删除行并可以指定条件,TRUNCATE 用于快速删除所有行但不能指定条件,而 DROP 用于删除整个表或数据库对象。在实际使用中,选择哪个命令取决于你的具体需求,比如是否需要保留表结构、是否需要能够回滚操作、是否需要指定删除条件等。

相关推荐
BoomHe33 分钟前
Now in Android 架构模式全面分析
android·android jetpack
ma_king3 小时前
入门 java 和 数据库
java·数据库·后端
jiayou646 小时前
KingbaseES 实战:审计追踪配置与运维实践
数据库
二流小码农8 小时前
鸿蒙开发:上传一张参考图片便可实现页面功能
android·ios·harmonyos
鹏程十八少8 小时前
4.Android 30分钟手写一个简单版shadow, 从零理解shadow插件化零反射插件化原理
android·前端·面试
Kapaseker8 小时前
一杯美式搞定 Kotlin 空安全
android·kotlin
三少爷的鞋9 小时前
Android 协程时代,Handler 应该退休了吗?
android
NineData18 小时前
NineData 迁移评估功能正式上线
数据库·dba
火柴就是我1 天前
让我们实现一个更好看的内部阴影按钮
android·flutter
NineData1 天前
数据库迁移总踩坑?用 NineData 迁移评估,提前识别所有兼容性风险
数据库·程序员·云计算