某日递简历,顺便和面试官亲密接触,被问及上面三个数据库操作的异同,用过delete,drop未用过truncate,网页搜索,初步认识。

DELETE

The DELETE command is used to remove rows from a table. A WHERE clause can be used to only remove some rows. If no WHERE condition is specified, all rows will be removed. After performing a DELETE operation you need to COMMIT or ROLLBACK the transaction to make the change permanent or to undo it. Note that this operation will cause all DELETE triggers on the table to fire.

SQL> SELECT COUNT(*) FROM emp;COUNT(*)
----------14SQL> DELETE FROM emp WHERE job = 'CLERK';4 rows deleted.SQL> COMMIT;Commit complete.SQL> SELECT COUNT(*) FROM emp;COUNT(*)
----------10

TRUNCATE

TRUNCATE removes all rows from a table. The operation cannot be rolled back and no triggers will be fired. As such, TRUCATE is faster and doesn't use as much undo space as a DELETE.

SQL> TRUNCATE TABLE emp;Table truncated.SQL> SELECT COUNT(*) FROM emp;COUNT(*)
----------0

DROP

The DROP command removes a table from the database. All the tables' rows, indexes and privileges will also be removed. No DML triggers will be fired. The operation cannot be rolled back.

SQL> DROP TABLE emp;Table dropped.SQL> SELECT * FROM emp;
SELECT * FROM emp*
ERROR at line 1:
ORA-00942: table or view does not exist
DROP and TRUNCATE are DDL commands, whereas DELETE is a DML command. Therefore DELETE operations can be rolled back (undone), while DROP and TRUNCATE operations cannot be rolled back.

貌似在oracle中delete可以回滚,sql server是不是可以用事务实现。

相同点:

1.truncate和不带where子句的delete, 以及drop都会删除表内的数据。

2.drop,truncate都是DDL(数据定义语言)语句,执行后会自动提交

不同点:

1. truncate和 delete只删除数据不删除表的结构(定义) 
   drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger),索引(index); 依赖于该表的存储过程/函数将保留,但是变为invalid状态.

2.delete语句是dml,这个操作会放到rollback segement中,事务提交之后才生效;如果有相应的trigger,执行的时候将被触发. 
truncate,drop是ddl, 操作立即生效,原数据不放到rollback segment中,不能回滚. 操作不触发trigger.

3.delete语句不影响表所占用的extent, 高水线(high watermark)保持原位置不动 
drop语句将表所占用的空间全部释放 
   truncate 语句缺省情况下见空间释放到 minextents个 extent,除非使用reuse storage; truncate会将高水线复位(回到最开始).

4.速度,一般来说: drop> truncate > delete

5.安全性:

小心使用drop 和truncate,尤其没有备份的时候.使用上,想删除部分数据行用delete,注意带上where子句. 回滚段要足够大. 
想删除表,当然用drop 
想保留表而将所有数据删除. 如果和事务无关,用truncate即可. 如果和事务有关,或者想触发trigger,还是用delete. 
如果是整理表内部的碎片,可以用truncate跟上reuse stroage,再重新导入/插入数据

6.delete是DML语句,不会自动提交。

drop,truncate都是DDL(数据定义语言)语句,执行后会自动提交

1.DELETE ・DML语言 ・可以回退 ・可以有条件的删除

     DELETE FROM 表名   WHERE 条件

2.TRUNCATE TABLE ・DDL语言 ・无法回退 ・默认所有的表内容都删除 ・删除速度比delete快。

   TRUNCATE TABLE 表名
1、TRUNCATE在各种表上无论是大的还是小的都非常快。如果有ROLLBACK命令Delete将被撤销,而TRUNCATE则不会被撤销。 2、TRUNCATE是一个DDL语言,向其他所有的DDL语言一样,他将被隐式提交,不能对TRUNCATE使用ROLLBACK命令。 3、TRUNCATE将重新设置高水平线和所有的索引。在对整个表和索引进行完全浏览时,经过TRUNCATE操作后的表比Delete操作后的表要快得多。 4、TRUNCATE不能触发任何Delete触发器。 5、当表被清空后表和表的索引讲重新设置成初始大小,而delete则不能。 6、不能清空父表。

在oracle里,使用delete删除数据以后,数据库的存储容量不会减少,而且使用delete删除某个表的数据以后,查询这张表的速度和删除之前一样,不会发生变化。

因为oralce有一个HWM高水位,它是oracle的一个表使用空间最高水位线。当插入了数据以后,高水位线就会上涨,但是如果你采用delete语句删除数据的话,数据虽然被删除了,但是高水位线却没有降低,还是你刚才删除数据以前那么高的水位。除非使用truncate删除数据。那么,这条高水位线在日常的增删操作中只会上涨,不会下跌,所以数据库容量也只会上升,不会下降。而使用select语句查询数据时,数据库会扫描高水位线以下的数据块,因为高水位线没有变化,所以扫描的时间不会减少,所以才会出现使用delete删除数据以后,查询的速度还是和delete以前一样。

转载于:https://www.cnblogs.com/forfutureofK-K/archive/2012/11/30/2795745.html

TRUNCATE DELETE相关推荐

  1. MySql中truncate,delete,drop的异同点

    truncate,delete,drop的异同点 注意:这里说的delete是指不带where子句的delete语句 相同点:truncate和不带where子句的delete, 以及drop都会删除 ...

  2. Mysql的drop/truncate/delete

    drop > truncate > delete drop删除结构与数据 truncate删除表的所有数据,不可恢复 delete有条件删除数据,可以恢复

  3. truncate delete 与 drop的区别

    一张表几亿条数据.根据task_id删除几千万. delete删除后查询,发现查询速度还是没有变快.explain查看 rows并没有发生变化.查询速度肯定也不会变化.原因? truncate del ...

  4. truncate,delete,drop的异同点

    源:网海拾贝 truncate,delete,drop的异同点   看重:这里说的delete是指不带where子句的delete语句    相反点:truncate和不带where子句的delete ...

  5. drop truncate delete区别

    在实际应用中,三者的区别是明确的. 当你不再需要该表时, 用 drop; 当你仍要保留该表,但要删除所有记录时, 用 truncate; 当你要删除部分记录时(always with a WHERE  ...

  6. TRUNCATE,DELETE,DROP的区别

    https://zhidao.baidu.com/question/171481100.html TRUNCATE   清空数据和数据占用空间  不删除表结构 DELETE        清空数据,不 ...

  7. Oracle中删除表(drop,truncate,delete)

    drop命令 drop table 表名:例如:删除商品表 drop table commodity:注意:1.用drop删除表数据,不但会删除表中的数据,连表结构也被删除了! truncate命令 ...

  8. mysql truncate delete 释放磁盘空间

    我的mysql一张表中有1000万条记录,我使用delete删除记录后,虽然表为空,但是我使用navicate打开表时,加载还是很慢.于是我执行下truncate,打开就很快了.网上查下作者这样说的: ...

  9. 有关 drop delete truncate 问题

    drop 可以删除数据库 数据表 数据表中字段 delete 删除数据表中的行 而不删除数据表 可以删除一行: Delete from 表 where 列名称=值 或是多行: Delete from ...

最新文章

  1. oracle plsql开启并行,Oracle开启并行的几种方法
  2. 嫦娥“挖土”归来有多难?看看中国首颗返回式卫星的故事
  3. Cacti 每日导出图形及流量报表 [未完成]
  4. JDK环境变量配置(一次性成功)
  5. java xml转map_java练习本(原每日一练)(20190514)
  6. 游戏工委:已有63家单位响应防止未成年人沉迷通知
  7. 一键提取app源码_【补发】自动答题脚本教程及源码分享(无视分辨率)
  8. 超强 | 保险单据在线OCR,秒速识别保单信息
  9. 客户端session与服务端session
  10. Scratch-贪吃蛇小游戏
  11. VS2019配置WinPcap开发
  12. 技术团队管理经验总结(持续更新)
  13. XML学习记录(归纳总结,方便查看)
  14. 从网线到网络设备是如何工作的
  15. [系统控件重绘教程(一)]重绘NSWindow
  16. android应用程序设计_UED干货 | 一篇文章知晓小程序设计
  17. NoSQL 一致性[详解]更新一致性
  18. 触动精灵 python_触动精灵远程Log模块
  19. 股票自动委托下单html,股票怎么设置自动挂单?股票交易挂单规则
  20. 国标、行标、地标、团标、企标

热门文章

  1. ubuntu 13.04 mysql_Ubuntu 13.04 MySQL Proxy安装与配置
  2. websocket java8_Java API For WebSocket(八)服务器安全
  3. 数据库设计三大范式应用实例剖析(讲得比较清楚)
  4. Linux常用命令(掌握完操作Linux基本就够用了)
  5. Docker基础学习笔记01:Docker安装
  6. 【BZOJ2959】【codevs2002】长跑,维护双联通分量
  7. java spi与api,SPI和API之间的区别?
  8. horizon服务主要模块_openstack七大模块概述
  9. 2017.9.20 cheat 失败总结
  10. 【英语学习】【WOTD】thole 释义/词源/示例