zoukankan      html  css  js  c++  java
  • TRUNCATE 删除表,无法回退。默认选择为整个表的内容,所以不能加条件。


    TRUNCATE 删除表,无法回退。默认选择为整个表的内容,所以不能加条件。
    DELETE 删除表,可以回退。可以带where 条件。建议使用delete。但是TRUNCATE 删除表数据比delete要快。


    使用TRUNCATE TABLE语句

    TRUNCATE TABLE语句提供了一种删除表中所有记录的快速方法。因为TRUNCATE TABLE语句不记录日志,只记录整个数据页的释放操作,而DELETE语句对每一行修改都记录日志,所以使用TRUNCATE TABLE语句进行删除操作总是比没有指定条件的DELETE语句效率高。TRUNCATE TABLE立即释放了表中数据及索引所占用的全部空间,同时也释放了分配给所有索引的空间。其语法格式如下:
    TRUNCATE TABLE [ [database.] owner.] table_name
    与DELETE语句相比,TRUNCATE TABLE具有以下优点:
    l   所用的事务日志空间较少  DELETE语句每次删除一行,并在事务日志中为所删除的每行记录一个项。TRUNCATE TABLE通过释放用于存储表数据的数据页来删除数据,并且在事务日志中只记录页释放。
    l   使用的锁通常较少  当使用行锁执行DELETE语句时,将会锁定表中各行以便删除。TRUNCATE TABLE始终锁定表和页,而不是锁定各行。
    l   表中将毫无例外地不留下任何页  执行DELETE语句后,表仍会包含空页。例如,必须至少使用一个排他(LCK_M_X)表锁,才能释放堆中的空表。如果执行删除操作时没有使用表锁,表(堆)中将包含许多空页。对于索引,删除操作会留下一些空页,尽管如此,不过这些页会通过后台清除进程迅速释放。
    那么可不可以用TRUNCATE TABLE代替不带WHERE子句的DELETE语句呢?在以下几种情况是不行的:
    l   在需要保留标识的情况下不能用TRUNCATE TABLE,因为TRUNCATE TABLE会重置标识。
    l   在需要使用触发器的情况下不能使用TRUNCATE TABLE,因为它不会激发触发器。
    l   对于由FOREIGN KEY约束引用的表(即主键所在的表,不是外键所在的表)不能使用TRUNCATE TABLE.
    l   对于参与了索引视图的表不能使用TRUNCATE TABLE,注意指的是索引视图,并非普通视图。
    那么用户需要具有什么权限才可以使用TRUNCATE TABLE呢?若要使用TRUNCATE TABLE语句,必须是表的所有者,具有DBA权限或表的ALTER权限。对于基表,TRUNCATE TABLE语句需要有表的排他访问权限,因为操作是原子操作(要么删除所有行,要么不删除任何行)。这意味着所有以前打开的游标和引用要截断的表的游标都必须关闭,并且必须发出COMMIT或ROLLBACK命令释放对表的引用。对于临时表,每个用户都有自己的数据副本,不需要排他访问。
    下面结合一个简单的实例来说明如何使用TRUNCATE TABLE语句。比如需要删除商品信息表中的所有数据,可以使用如下语句:
    TRUNCATE TABLE 商品信息

    由于TRUNCATE TABLE操作是不进行日志记录的,所以建议在TRUNCATE TABLE语句之前使用BACKUP DATABASE语句来对数据库做备份。
  • 相关阅读:
    系统实践2-2:查看dockerfile-032092135mysql容器的配置信息
    系统综合实践1
    SDN——实验脚本7-2:hardtimeout.json
    SDN——实验脚本7-1:odlnorth.py
    实验 7:OpenDaylight 实验——Python 中的 REST API 调用
    预习非数值数据的编码方式
    预习原码补码
    C语言ll作业01
    C语言寒假大作战04
    C语言寒假大作战03
  • 原文地址:https://www.cnblogs.com/hyq0002013/p/5911483.html
Copyright © 2011-2022 走看看