zoukankan      html  css  js  c++  java
  • delete,truncate 和 delete之间的区别

    1.首先看下语法定义:

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

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

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

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

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

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

    sql语句中删除表数据drop、truncate和delete的用法 三联

      当执行下面代码之后

    sql语句中删除表数据drop、truncate和delete的用法

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

    sql语句中删除表数据drop、truncate和delete的用法

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

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

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

    sql语句中删除表数据drop、truncate和delete的用法

      上图就表现了:删除内容

    sql语句中删除表数据drop、truncate和delete的用法

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

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

    sql语句中删除表数据drop、truncate和delete的用法

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

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

    sql语句中删除表数据drop、truncate和delete的用法

      右图:同样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

  • 相关阅读:
    SQL Server 阻止了对组件 'Ole Automation Procedures' 的 过程'sys.sp_OACreate' 的访问
    谷歌浏览器扩展程序manifest.json参数详解
    获取天气api
    UVA 10385 Duathlon
    UVA 10668 Expanding Rods
    UVALIVE 3891 The Teacher's Side of Math
    UVA 11149 Power of Matrix
    UVA 10655 Contemplation! Algebra
    UVA 11210 Chinese Mahjong
    UVA 11384 Help is needed for Dexter
  • 原文地址:https://www.cnblogs.com/alice-cj/p/10354737.html
Copyright © 2011-2022 走看看