SQL DDL—— drop、truncate和delete(mysql)的区别理解小记

16 篇文章 1 订阅

需要注意的是Hive是数据仓库,存储格式是文本,不支持行级别的更新删除和插入。所以在Hive中,只有drop tabletruncate操作,没有delete操作。

Drop

语法及注意点:
DROP TABLE [IF EXISTS] table_name [PURGE];

DROP TABLE命令将会删除这个表的元数据和数据,如果是内部表且配置了Trash并且PURGE没有指定数据将会被移动到当前目录的.Trash下,元数据会直接被删除,若是外部表,数据依然在文件系统中,只是删除元数据。若是使用DROP TABLE table_name PURGE,表数据将会被直接删除而不是移动到.Trash,因此在使用时需要小心,前边介绍过可以再创建表时定义 TBLPROPERTIESauto.purge的值也会有此功能。在hivedrop表不存在将会报错,除非你使用IF EXISTS或者配置 hive.exec.drop.ignorenonexistenttrue

TRUNCATE

语法及注意点:
TRUNCATE TABLE table_name [PARTITION partition_spec];

partition_spec:
  : (partition_column = partition_col_value, partition_column = partition_col_value, ...)

要主要使用TRUNCATE命名的表不能是外部表或者非本地表,使用这个命令将会移除表或者分区下的所有数据,如果Trash可用数据将会被删除到Trash中,否则将会被直接删除删除分区下数据时用户可以指定多个分区。从hive2.3起,TRUNCATE命令也与TBLPROPERTIESauto.purge有关系。TRUNCATE TABLE 则一次性地从表中删除所有的数据并不把单独的删除操作记录记入日志保存,删除行是不能恢复的。并且在删除的过程中不会激活与表有关的删除触发器。执行速度快。

DELETE

语法及注意点:
DELETE FROM table_name WHERE clounm_name = value;

DELETE FROM student WHERE name='张三丰';

DELETE语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作。

三种删除操作的区别

操作操作类型功能提交表与索引所占空间应用范围执行速度
deleteDMLdelete是DML,执行delete操作时,每次从表中删除一行,并且同时将该行的的删除操作记录在redo和undo表空间中以便进行回滚(rollback)和重做操作,但要注意表空间要足够大.需要手动提交(commit)操作才能生效,如果要撤销只能通过rollback操作。DELETE操作不会减少表或索引所占用的空间可以是table和view
dropDLL操作立即生效,原数据不放到 rollback segment中,DROP则删除整个表(结构和数据)。会隐式提交,所以,不能回滚,不会触发触发器。drop语句将表所占用的空间全释放掉。
truncateDLL操作立即生效,原数据不放到rollback segment中。删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用 DELETE。如果要删除表定义及其数据,请使用DROP TABLE语句。当表被TRUNCATE 后,这个表和索引所占用的空间会恢复到初始大小会隐式提交,所以,不能回滚,不会触发触发器。只能对TABLE
注意点分析

(1)、truncate与不带wheredelete相同 :只删除数据,而不删除表的结构(定义)
(2)、 drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger)索引(index);依赖于该表的存储过程/函数将被保留,但其状态会变为:invalid。
(3)、 Truncate table 表名 速度快,而且效率高的原因是: truncate table 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行。但 TRUNCATE TABLEDELETE速度快,且使用的系统和事务日志资源少。DELETE语句每次删除一行,并在事务日志中为所删除的每行记录一项。TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。

使用场景分析

1、在没有备份情况下,谨慎使用 droptruncate
2、在数据库中要删除部分数据行采用delete且注意结合where来约束影响范围。回滚段要足够大。
3、要删除表用drop;
4、若想保留表而将表中数据删除,如果于事务无关,用truncate即可实现。
5、若想保留表而将表中数据删除,如果和事务有关,或想触发trigger,还是用delete
6、如果是整理表内部的碎片,可以用truncate跟上reuse stroage,再重新导入/插入数据。
7、对于由 FOREIGN KEY 约束引用的表,不能使用 TRUNCATE TABLE,而应使用不带WHERE 子句的 DELETE 语句。由于 TRUNCATE TABLE 不记录在日志中,所以它不能激活触发器。
8、truncate table不能用于删除使用了索引视图的表。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

扫地增

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值