SQL DDL—— droptruncate和delete(mysql)的区别理解小记
Posted 扫地增
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL DDL—— droptruncate和delete(mysql)的区别理解小记相关的知识,希望对你有一定的参考价值。
需要注意的是
Hive
是数据仓库,存储格式是文本,不支持行级别的更新删除和插入。所以在Hive
中,只有drop table
、truncate
操作,没有delete
操作。
Drop
语法及注意点:
DROP TABLE [IF EXISTS] table_name [PURGE];
DROP TABLE
命令将会删除这个表的元数据和数据
,如果是内部表
且配置了Trash
并且PURGE没有指定数据
将会被移动到当前目录的.Trash下,元数据会直接被删除
,若是外部表,数据依然在文件系统中,只是删除元数据
。若是使用DROP TABLE table_name PURGE,表数据将会被直接删除而不是移动到.Trash
,因此在使用时需要小心,前边介绍过可以再创建表时定义TBLPROPERTIES
中auto.purge
的值也会有此功能。在hive
中drop
表不存在将会报错,除非你使用IF EXISTS
或者配置hive.exec.drop.ignorenonexistent
为true
。
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
命令也与TBLPROPERTIES
中auto.purge
有关系。TRUNCATE TABLE
则一次性地从表中删除所有的数据并不把单独的删除操作记录记入日志保存,删除行是不能恢复的
。并且在删除的过程中不会激活与表有关的删除触发器。执行速度快。
DELETE
语法及注意点:
DELETE FROM table_name WHERE clounm_name = value;
DELETE FROM student WHERE name='张三丰';
DELETE
语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作。
三种删除操作的区别
操作 | 操作类型 | 功能 | 提交 | 表与索引所占空间 | 应用范围 | 执行速度 |
---|---|---|---|---|---|---|
delete | DML | delete是DML,执行delete操作时,每次从表中删除一行,并且同时将该行的的删除操作记录在redo和undo表空间中以便进行回滚(rollback)和重做操作,但要注意表空间要足够大. | 需要手动提交(commit)操作才能生效,如果要撤销只能通过rollback操作。 | DELETE操作不会减少表或索引所占用的空间 | 可以是table和view | 慢 |
drop | DLL | 操作立即生效,原数据不放到 rollback segment中,DROP则删除整个表(结构和数据)。 | 会隐式提交,所以,不能回滚,不会触发触发器。 | drop语句将表所占用的空间全释放掉。 | 快 | |
truncate | DLL | 操作立即生效,原数据不放到rollback segment中。删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用 DELETE。如果要删除表定义及其数据,请使用DROP TABLE语句。 | 当表被TRUNCATE 后,这个表和索引所占用的空间会恢复到初始大小 | 会隐式提交,所以,不能回滚,不会触发触发器。 | 只能对TABLE | 中 |
注意点分析
(1)、
truncate
与不带where
的delete
相同 :只删除数据,而不删除表的结构(定义)
(2)、drop
语句将删除表的结构被依赖的约束(constrain),触发器(trigger)索引(index);依赖于该表的存储过程/函数将被保留,但其状态会变为:invalid。
(3)、Truncate table 表名 速度快,而且效率高
的原因是:truncate table
在功能上与不带WHERE
子句的DELETE
语句相同:二者均删除表中的全部行。但TRUNCATE TABLE
比DELETE
速度快,且使用的系统和事务日志资源少。DELETE
语句每次删除一行,并在事务日志中为所删除的每行记录一项。TRUNCATE TABLE
通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。
使用场景分析
1、在没有备份情况下,谨慎使用
drop
与truncate
。
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
不能用于删除使用了索引视图的表。
以上是关于SQL DDL—— droptruncate和delete(mysql)的区别理解小记的主要内容,如果未能解决你的问题,请参考以下文章
mysql 删除语句:droptruncate和delete
Sql语句——删除表数据droptruncate和delete的用法
SQL语句中----删除表数据droptruncate和delete的用法