Mysql之drop、truncate和delete的区别
一、delete
1、delete是DML,执行delete操作时,每次从表中删除一行,并且同时将该行的的删除操作记录在redo和undo表空间中以便进行回滚(rollback)和重做操作,但要注意表空间要足够大,需要手动提交(commit)操作才能生效,可以通过rollback撤消操作。
2、delete可根据条件删除表中满足条件的数据,如果不指定where子句,那么删除表中所有记录。
3、delete语句不影响表所占用的extent,高水线(high watermark)保持原位置不变。
(从InnoDB存储引擎的逻辑结构看,所有数据都被逻辑地存放在一个空间内,称为表空间,而表空间由段(sengment)、区(extent)、页(page)组成。ps:页在一些文档中又称块(block)。)
二、truncate
1、truncate是DDL,会隐式提交,所以,不能回滚,不会触发触发器。
2、truncate会删除表中所有记录,并且将重新设置高水线和所有的索引,缺省情况下将空间释放到minextents个extent,除非使用reuse storage。不会记录日志,所以执行速度很快,但不能通过rollback撤消操作(如果一不小心把一个表truncate掉,也是可以恢复的,只是不能通过rollback来恢复)。
3、对于外键(foreignkey )约束引用的表,不能使用 truncate table,而应使用不带 where 子句的 delete 语句。
4、truncatetable不能用于参与了索引视图的表。
三、drop
1、drop是DDL,会隐式提交,所以,不能回滚,不会触发触发器。
2、drop语句删除表结构及所有数据,并将表所占用的空间全部释放。
3、drop语句将删除表的结构所依赖的约束,触发器,索引,依赖于该表的存储过程/函数将保留,但是变为invalid状态。
四、三者区别
(1)DELETE语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作。
TRUNCATE TABLE 则一次性地从表中删除所有的数据并不把单独的删除操作记录记入日志保存,删除行是不能恢复的。并且在删除的过程中不会激活与表有关的删除触发器。执行速度快。
(2)表和索引所占空间。
当表被TRUNCATE 后,这个表和索引所占用的空间会恢复到初始大小,
DELETE操作不会减少表或索引所占用的空间。
drop语句将表所占用的空间全释放掉。
(3)一般而言,drop > truncate > delete
(4)应用范围。
TRUNCATE 只能对TABLE; DELETE可以是table和view
(5)TRUNCATE 和DELETE只删除数据, DROP则删除整个表(结构和数据)。
(6)truncate与不带where的delete :只删除数据,而不删除表的结构(定义)drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger)索引(index);依赖于该表的存储过程/函数将被保留,但其状态会变为:invalid。
(7)delete语句为DML(data maintain Language),这个操作会被放到 rollback segment中,事务提交后才生效。如果有相应的 tigger,执行的时候将被触发。
(8)truncate、drop是DLL(data define language),操作立即生效,原数据不放到 rollback segment中,不能回滚
(9)在没有备份情况下,谨慎使用 drop 与 truncate。要删除部分数据行采用delete且注意结合where来约束影响范围。回滚段要足够大。要删除表用drop;若想保留表而将表中数据删除,如果于事务无关,用truncate即可实现。如果和事务有关,或老师想触发trigger,还是用delete。
(10) Truncate table 表名 速度快,而且效率高,因为:
truncate table 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少。DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。
(11) TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用 DELETE。如果要删除表定义及其数据,请使用 DROP TABLE 语句。
(12) 对于由 FOREIGN KEY 约束引用的表,不能使用 TRUNCATE TABLE,而应使用不带 WHERE 子句的 DELETE 语句。由于 TRUNCATE TABLE 不记录在日志中,所以它不能激活触发器。
如果您使用InnoDB表,MySQL将在删除数据之前检查表中是否存在任何可用的外键约束。以下是案例:
- 如果表有任何外键约束,则TRUNCATE TABLE语句将逐个删除行。如果外键约束具有DELETE CASCADE操作,则还会删除子表中的相应行。
- 如果外键约束未指定DELETE CASCADE操作,则TRUNCATE TABLE逐个删除行,并且当遇到子表中的行引用的行时,它将停止并发出错误。
- 如果表没有任何外键约束,则TRUNCATE TABLE语句将删除表并重新创建一个具有相同结构的新空表,这比使用DELETE语句(尤其是对于大表)更快更有效。
如果您正在使用其他存储引擎,则TRUNCATE TABLE语句将丢弃并重新创建一个新表。
请注意,如果表具有AUTO_INCREMENT列,则TRUNCATE TABLE语句会将自动增量值重置为零。
此外,TRUNCATE TABLE语句不使用DELETE语句,因此,不会调用与表关联的DELETE触发器。
五、总结
1、在速度上,一般来说,drop> truncate > delete。
2、在使用drop和truncate时一定要注意,虽然可以恢复,但为了减少麻烦,还是要慎重。
3、如果想删除部分数据用delete,注意带上where子句,回滚段要足够大;
如果想删除表,当然用drop;
如果想保留表而将所有数据删除,如果和事务无关,用truncate即可;
如果和事务有关,或者想触发trigger,还是用delete;
如果是整理表内部的碎片,可以用truncate跟上reuse stroage,再重新导入/插入数据。
参考文章:
1.drop、truncate和delete的区别
2.Mysql中truncate table和delete语句的区别
3.MySQL TRUNCATE TABLE
Mysql之drop、truncate和delete的区别相关推荐
- mysql truncate drop_详解MySQL中DROP,TRUNCATE 和DELETE的区别实现mysql从零开始 | 很文博客...
不同点: 1. truncate和 delete只删除数据不删除表的结构(定义) drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger),索引(index); 依赖于该 ...
- 详解MySQL中DROP,TRUNCATE 和DELETE的区别
注意:这里说的delete是指不带where子句的delete语句 相同点: truncate和不带where子句的delete, 以及drop都会删除表内的数据 不同点: 1. truncate和 ...
- 深度分析DROP,TRUNCATE与DELETE的区别【我的数据库之路系列】
深度分析DROP,TRUNCATE与DELETE的区别[我的数据库之路系列] 转载自:http://hi.baidu.com/bjn_wuming/blog/item/8b27a9af36ef26f6 ...
- MYSQL基本知识:TRUNCATE和DELETE的区别
目录 1.条件删除 2. 事务回滚 3. 清理速度 4. 高水位重置 MYSQL中TRUNCATE和DELETE都能够清理表中的数据,那它们的基本区别是什么呢? 1.条件删除 这个比较好理解,因为DE ...
- drop、truncate和delete的区别
drop.truncate和delete的区别 (1)DELETE语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作. TRUNCATE TA ...
- MySQL数据库:drop、truncate、delete的区别
1.删除速度:drop>truncate>delete: 2.删除方式: (1)执行delete操作时,每次从表中删除一行,并且同时将该行的的删除操作记录在日志文件中.delete可根据w ...
- 【mysql】drop、truncate和delete的区别
文章目录 1. drop:删除数据库 2. 对比 TRUNCATE TABLE 和 DELETE FROM 3. DDL 和 DML 的说明 1. drop:删除数据库 drop语句将表所占用的空间全 ...
- oracle中drop和delete,oracle中delete drop truncate的用法和区别
数据库的运维中,经常会遇到delete drop truncate的操作,那么如何去把握它们的用法和区别呢? 比如当数据库空间爆满,已经增长到存储空间单个存储文件的最大值32G.你需要通过一些办法释放 ...
- Mysql的drop/truncate/delete
drop > truncate > delete drop删除结构与数据 truncate删除表的所有数据,不可恢复 delete有条件删除数据,可以恢复
最新文章
- pycharm windows 服务器_环境配置 | Pycharm远程开发的环境配置
- 带你用4行代码训练RNN生成文本(附资源)
- 奔四的听力障碍码农,被开除15次,面试被拒200+次,还要继续干下去吗?
- mysql题目_MySQL练习题
- 修改终端服务器的最大连接数
- 计算机网络 --- 局域网中的以太网
- 利用QSharedMemory 保证单个程序运行
- django-模板的转义
- matlab 贝叶斯工具箱,matlab的BNT贝叶斯工具箱错误求教
- 区块链必读的书_最好的区块链:5条必读
- Gradle之使用Gradle的命令行
- 将 Kubernetes 云原生技术革命进行到底!
- windows mysql 自动备份_windows mysql 自动备份的几种方法总结--岁月博客提供
- ImportError: cannot import name 'imresize'
- 73种网页常用js代码
- 最新添加了一键加入服务器的功能,功能介绍 - 晴天漫画系统 晴天漫画程序 基于标签的一套自动采集更新漫画系统...
- 《CSS世界》学习感想(持续更新)
- 数字图像处理的发展历史、应用领域、主要来源
- 计算机桌面颜色比较暗,电脑显示器颜色偏暗怎么回事
- 【办公应用软件】万彩办公大师教程丨屏幕OCR工具的应用
热门文章
- IDEA 2022.2.1 Beta 2发布:新增支持Java 18、增强JUnit 5的支持
- 皮一皮:这有够不明显的...
- 皮一皮:据说这句话高情商的人说起来不一样...
- 舒服了,微信支持多设备同时在线!
- 7月平均工资下来,Java程序员哭笑不得!
- linux下运行js挖矿,利用 JavaScript 代码挖矿
- linux脚本或关系表达,Shell运算符:Shell算数运算符、关系运算符、布尔运算符、字符串运算符等...
- Google Colab 使用教程(1)
- python wget
- pytorch 指定层学习率