首页 > 其他分享 >Truncate的使用详解

Truncate的使用详解

时间:2023-04-18 14:13:09浏览次数:32  
标签:语句 Truncate truncate 删除 drop 详解 使用 delete

删除表中数据的方法有 delete 和 truncate, 其中TRUNCATE TABLE用于删除表中的所有行,而不记录单个行删除操作;TRUNCATE TABLE 与没有 WHERE 子句的 DELETE 语句类似,但是,TRUNCATE TABLE 速度更快,使用的系统资源和事务日志资源更少。下面介绍Truncate的用法

1.truncate使用语法
Truncate 语法能够快速清空数据表内所有数据,并且能针对具有自动递增值的字段,做计数重置归零重新计算的作用,只能作用于表。

Truncate的语法很简单,后面直接跟表名即可,例如: truncate table tbl_name 或者 truncate tbl_name 。

执行truncate语句时需要拥有表的drop权限,从逻辑上讲,truncate table类似于delete删除所有行的语句或 drop table然后再create table语句的组合。为了实现高性能,它绕过了删除数据的DML方法,因此,它不能回滚。尽管truncate table与delete相似,但它被分类为DDL语句而不是DML语句。

2.truncate与drop,delete的对比
truncate 与 delete、drop 三者之间的异同:

delete语句是DML语言,操作后会放在 rollback segement 中,事物提交后才生效,如果有相应的触发器(trigger),执行时将被触发,可回滚。truncate、drop 是DDL语言,执行后会自动提交立即生效,原数据不会放到 rollback中,不能回滚,操作不会触发trigger。
Delete 语句每次删除一行,并在事务日志中为所删除的每行记录一项。Truncate Table 通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。
truncate和 delete 只删除表的数据(定义),表结构及其约束、索引等保持不变;drop语句将删除表的结构、被依赖的约束(constrain)、触发器 (trigger)、索引(index),依赖于该表的存储过程/函数将保留,但是变为invalid状态。
truncate后会使表和索引所占用的空间会恢复到初始大小;delete操作不会减少表或索引所占用的空间,drop语句将表所占用的空间全释放掉。
Truncate Table 在功能上与不带 Where子句的 Delete 语句相同:二者均删除表中的全部行,但 Truncate Table 比 Delete 速度快,且使用的系统和事务日志资源少。
truncate只能作用于表;delete,drop可作用于表、视图。truncate 清空表中所有数据;drop一般用于删除整体性数据 ,如表、模式、索引、视图、完整性限制等;delete用于删除局部性数据 如表中的某一元组。
在安全性方面,要谨慎使用 drop、truncate,特别是没有做备份的情况下:如何表数据完全不需要时可以用truncate;如果想删除部分数据可使用 delete 需要带上 where子句,回滚段要足够大;如果想删除表可以用 drop;如果想保留表而将所有数据删除且和事务无关,用truncate即可;如果和事物有关,或者想触发 trigger,则使用delete;如果是整理表内部的碎片,可以用 truncate 跟上 reuse stroage,再重新导入、插入数据。
3.truncate注意事项
无论怎样,truncate表都是高危操作,特别是在生产环境要更加谨慎使用,下面列出几点注意事项。

Truncate Table 删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用 Delete 。如果要删除表定义及其数据,请使用 DROP TABLE 语句。
对于由 Foreign Key (外键) 约束引用的表,不能使用 Truncate Table,而应使用不带 Where子句的 Delete 语句。由于 Truncate Table 不记录在日志中,所以它不能激活触发器。
Truncate Table 不能用于参与了索引视图的表。
对用 Truncate Table 删除数据的表增加数据时,要使用Update Statistics 来维护索引信息。
如果有 Rollback 语句,Delete 操作将被撤销,但 Truncate 不会撤销。
执行 Truncate 需要 drop权限,不建议给账号drop权限;执行 Truncate 前一定要再三检查确认,最好提前备份下表数据。
4.truncate不宜使用场景
由 FOREIGN KEY 约束引用的表(可以截断具有引用自身的外键的表)
参与索引视图的表
通过使用事务复制或合并复制发布的表
对于具有以上一个或多个特征的表,请使用 DELETE 语句
TRUNCATE TABLE 不能激活触发器,因为该操作不记录各个行删除

标签:语句,Truncate,truncate,删除,drop,详解,使用,delete
From: https://www.cnblogs.com/lemperor/p/17329333.html

相关文章

  • vue项目使用定时器每隔几秒运行一次某方法
    代码如下:data(){return{timer:null,//定时器名称};},created(){this.setTime();},beforeDestroy(){clearInterval(this.timer);//清除定时器this.timer=null;},methods:{setTime(){//每隔一分钟运行一次保存方法this.timer......
  • 如何修复树莓派在更换了一个 SD 系统卡后,无法使用 SSH 登录问题 All In One
    如何修复树莓派在更换了一个SD系统卡后,无法使用SSH登录问题AllInOneknownhostsRaspberryPi无法SSH登录,报错❌/Users/xgqfrms-mm/.ssh/[email protected]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@WARNING:REMO......
  • 您应该使用哪个版本的SQL Server?
    在安装下一个SQLServer之前,请先等等。您确定使用的是正确的版本吗?我知道,管理层希望您继续使用较旧的版本,供应商表示他们将仅支持较旧的版本,但是现在您有机会为较新的版本辩护,我将从黑暗时代开始,介绍每个较新的版本。一、应考虑使用SQLServer2008您正在处理的是不再受支持的古老......
  • 使用强大的可视化工具redislive来监控我们的redis,别让自己死的太惨~~~
    作为玩windows的码农,在centos上面装点东西,真的会崩溃的要死,,,我想大家也知道,在centos上面,你下载的是各种源代码,需要自己编译。。。而使用yum的话,这个吊软件包有点想nuget,不过yum上面都是老的掉牙的软件。。。有时候还要升级,比如我在安装redis的另一种监控re......
  • 使用Task的一些知识优化了一下同事的多线程协作取消的一串代码
    最近在看一个同事的代码,代码的本意是在main方法中开启10个线程,用这10个线程来处理一批业务逻辑,在某一时刻当你命令console退出的时候,这个时候不是立即让console退出,而是需要等待10个线程把检测状态之后的业务逻辑执行完之后再退出,这样做是有道理的,如果强......
  • mongodb 3.x 之实用新功能窥看[1] ——使用TTLIndex做Cache处理
    mongodb一直都在不断的更新,不断的发展,那些非常好玩也非常实用的功能都逐步加入到了mongodb中,这不就有了本篇对ttlindex的介绍,刚好我们的生产业务场景中就有这个一个案例。。。 一:案例分析   我们生产的推荐系统要给用户发送短信和邮件的关联营销......
  • 搭建高可用的rabbitmq集群 + Mirror Queue + 使用C#驱动连接
    我们知道rabbitmq是一个专业的MQ产品,而且它也是一个严格遵守AMQP协议的玩意,但是要想骚,一定需要拿出高可用的东西出来,这不本篇就跟大家说一下cluster的概念,rabbitmq是erlang写的一个成品,所以知道如何构建erlang的node集群就ok了,他需要一个统一的cookie机制......
  • vite vue使用pont-engine
    pont-engine是一款阿里的api生成工具!安装依赖即可yarnadd--devpont-engine然后即可使用pontstart问题但是因为默认生成的代码包含cjs的模块语法,所以vite无法识别。另外生成代码前最好把旧的生成目录删除!解决办法因此我做了如下优化,让您一键执行这些操作并生成适......
  • 如何使用 Xbox Series X 驾驶游戏练习车技 All In One
    如何使用XboxSeriesX模拟驾驶游戏练习车技AllInOne无需驾校,无需车辆,环保无污染,低成本,无时间、地点、天气等条件限制,方便,自由......
  • nprogress 使用
    #https://www.npmjs.com/package/nprogresspnpminprogress//main.jsimport'nprogress/nprogress.css'//App.vue自定义一下loading的滚动条样式<style>#nprogress.bar{background:#f4f4f4!important;height:3px!important;}</style>/......