1.首先看下语法定义:

drop table_name
truncate table_name
delete table_name [where column_name = value]

2.各个删除操作删除的内容:

drop:删除内容和定义,释放空间。简单来说就是把整个表去掉.以后要新增数据是不可能的,除非新增一个表

例如:一个班就是一个表,学生就是表中的数据,学生的职务就是定义

  drop table class,就是把整个班移除.学生和职务都消失

  比如下面TestSchool数据库中有两张表[Classes]表和[Teacher]表

  当执行下面代码之后

  Classes表就被清楚,一干二净! 删除得非常暴力,作为老大实至名归

truncate:删除内容、释放空间但不删除定义。与drop不同的是,他只是清空表数据而已

  同样也是一个班,他只去除所有的学生.班还在,职务还在,如果有新增的学生可以进去,也可以分配上职务

  删除内容很容易理解,不删除定义也很容易理解,就是保留表的数据结构

  上图就表现了:删除内容

  执行语句之后,发现数据表的结构还在,也就是不删除定义

  至于释放空间,看下下面两幅图.你们就会明白的

  右图:Id列标识列,因之前delete过行数据,所以会出现标识列不连续(体现了delete删除是不释放空间的)

  经过truncate table Teacher 之后 再新增三条数据

  右图:同样Id是标识列,发现插入数据的时候,标识列连续了(体现了truncate删除是释放空间)

  注意:truncate 不能删除行数据,要删就要把表清空

delete:删除内容不删除定义,不释放空间

3.三者之间的区别

TRUNCATE TABLE 在功能上与不带 Where 子句的 Delete 语句相同:二者均删除表中的全部行。但 TRUNCATE TABLE 比 Delete 速度快,且使用的系统和事务日志资源少。

Delete 语句每次删除一行,并在事务日志中为所删除的每行记录一项。TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。

TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用 Delete。

对于由 FOREIGN KEY 约束引用的表,不能使用 TRUNCATE TABLE,而应使用不带 Where 子句的 Delete 语句。由于 TRUNCATE TABLE 不记录在日志中,所以它不能激活触发器。

TRUNCATE TABLE 不能用于参与了索引视图的表。

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

不同点: 
    1.truncate和 delete只删除数据不删除表的结构(定义) 
      drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger),索引(index); 依赖于该表的存储过程/函数将保留,但是变为invalid状态.
     
    2.delete语句是dml,这个操作会放到rollback segement中,事务提交之后才生效;如果有相应的trigger,执行的时候将被触发. 
      truncate,drop是ddl, 操作立即生效,原数据不放到rollback segment中,不能回滚. 操作不触发trigger.

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

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

5.安全性:小心使用drop 和truncate,尤其没有备份的时候.否则哭都来不及

使用上:
    想删除部分数据行用delete,注意带上where子句. 回滚段要足够大.

想删除表,当然用drop

想保留表而将所有数据删除. 如果和事务无关,用truncate即可. 如果和事务有关,或者想触发trigger,还是用delete.

如果是整理表内部的碎片,可以用truncate跟上reuse stroage,再重新导入/插入数据

参考:

https://www.php1.cn/detail/php-901883d7d7.html

https://www.cnblogs.com/fjl0418/p/7929420.html

https://www.cnblogs.com/ivy-xu/p/5716246.html

delete,truncate 和 delete之间的区别的更多相关文章

  1. delete trancate drop三者之间的区别

    简而言之: 删除效果及速度:Drop > truncate > delete 原因: delete,逐行删除,且用日志逐行记录用于回滚,会执行删除触发器:       ------> ...

  2. delete/truncate/drop table的区别以及锁在这里的角色

    数据库删除语句 Drop/Delete/Truncate比较 Delete :删除数据表中的行(可以删除某一行,也可以在不删除数据表的情况下删除所有行). 删除某一行:Delete from 数据表名 ...

  3. sql server 中删除表中数据truncate和delete的区别(转载自.net学习网)

    我们都知道truncate table可以用来删除整个表的内容,它与delete后面不跟where条件的效果是一样.但除此之外,我们还清楚它们之间有其它的区别吗?本章我们将一起讨论truncate与d ...

  4. truncate与delete 、drop的区别

    注意事项 1.在oracle中数据删除后还能回滚是因为它把原始数据放到了undo表空间. 2.DML语句使用undo表空间,DDL语句不使用undo,  而delete是DML语句,truncate是 ...

  5. MySQL数据库 crud语句 ifnull() 创建新账户 备份数据库 一对多关系 多对多(中间表) 外键约束 自关联 子查询注意事项 DML DDL DQL mysql面试题 truncate与delete的区别

    DML(data manipulation language): 它们是SELECT.UPDATE.INSERT.DELETE,就象它的名字一样,这4条命令是用来对数据库里的数据进行操作的语言 DDL ...

  6. mysql之drop、truncate和delete的区别

    今天在整理mysql数据库笔记的时候突然想到一个问题,就是drop.truncate和delete的区别,乍一看三者都是有删除的功能,但是具体来看还是有很多区别的.我先把这三个的作用简单说一下,有前辈 ...

  7. sql之truncate 、delete与drop区别

    sql之truncate .delete与drop区别相同点:truncate 和不带 where 子句的 delete,以及 drop 一定会删除表内的数据不同点:1. truncate 和 del ...

  8. drop,delete,truncate区别

    drop,delete,truncate区别 drop-->删除少量信息   eg:drop table 表名: delete-->删除某些数据   eg:delete from 表名: ...

  9. sql中truncate 、delete与drop区别

    SQL truncate .delete与drop区别   相同点: 1.truncate和不带where子句的delete.以及drop都会删除表内的数据. 2.drop.truncate都是DDL ...

随机推荐

  1. Servlet开发

    源地址:http://www.cnblogs.com/xdp-gacl/p/3760336.html 一.Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun ...

  2. 217/219. Contains Duplicate /Contains Duplicate II

    原文题目: 217. Contains Duplicate 219. Contains Duplicate II 读题: 217只要找出是否有重复值, 219找出重复值,且要判断两者索引之差是否小于k ...

  3. [C语言]变量VS常量

    -------------------------------------------------------------------------------------------- 1. 固定不变 ...

  4. postmessage/cors跨域postMessage、xhr2和xmldomain

    一.h5 postMessage node http-server配置服务器 有关配置:请参考我的http://www.cnblogs.com/leee/p/5502727.html 我把文件夹a配置 ...

  5. 远程批量获取Linux和Windos操作系统版本(内核)

    在不登录远程主机的情况下,可以查看远程主机的服务器操作系统版本(内核). 脚本执行前提: 1.拷贝check_snmp到脚本执行的主机中或在此主机中安装nagios; 2.保持list.txt中只有一 ...

  6. web.xml中的load-on-startup

    1)load-on-startup元素标记容器是否在启动的时候就加载这个servlet(实例化并调用其init()方法). 2)它的值必须是一个整数,表示servlet应该被载入的顺序 2)当值为0或 ...

  7. maintenance

    Maintenance Primitives Operator经常需要在包含Mesos集群的机器上执行维护任务. 大多数Mesos升级可以在不影响运行的任务的情况下完成,但是有些情况下维护可能会影响正 ...

  8. centos6 7 yum安装mongodb 3.6

    配置MongoDB的yum源 # 编辑文件 vim /etc/yum.repos.d/mongodb-org-3.6.repo # 添加以下内容 [mongodb-org-3.6] name=Mong ...

  9. MFC笔记1

    1.在对话框文档中定义两个定时器,每间隔5秒弹出一个消息框提示“定时器1”,每隔5秒弹出一个消息框提示“定时器2” UINT ID_TIMER1 = 1 , ID_TIMER2 = 2;   //设置 ...

  10. CSS同时选择器

    [CSS同时选择器] 同一个div拥有多个class时,我们可以作多个class作为组合来选择对象.方法就是将多个.className直接连接在一起(中间不能有空格). <p class=&qu ...