SQL中truncatetable和delete的区别
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都会删除表内的数据
truncate的区别不同点:
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,再重新导⼊/插⼊数据
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论