MySql中的delete、drop、truncate的区别 您所在的位置:网站首页 sql语句中的drop关键字的功能是从数据库中 MySql中的delete、drop、truncate的区别

MySql中的delete、drop、truncate的区别

2024-06-14 17:42| 来源: 网络整理| 查看: 265

目录

前言: 

简介:

delete: 

1、删除整张表的数据:

2、删除部分数据,添加where子句:

3、说明:

truncate:

1、只能操作表,将表中数据全部删除,在功能上和不带where子句的delete语句相同:

 2、说明:

drop:

1、drop语句将删除表的结构,以及被依赖的约束(constrain),触发器(trigger),索引(index);

 2、说明:

总结:

前言: 

1、 数据库在大的变动操作前记得备份。在备份的基础上进行delete、truncate等操作,即使清空了库也无所谓;

2、开启数据库的定时备份;

简介: delete:  1、删除整张表的数据:

delete from table_name;

2、删除部分数据,添加where子句:

delete from table_name where 条件...;

3、说明: delete是DML(data maintain language),这个操作会被放到rollback segment中,事务提交之后才会生效,如果有相应的触发器trigger,那么执行的时候可以被触发执行delete操作时,每次从表中删除一行,并且同时将该行的的删除操作记录在redo和undo表空间中以便进行回滚(rollback)和重做操作,但要注意表空间要足够大,需要手动提交(commit)操作才能生效,可以通过rollback撤消操作。delete可根据条件删除表中满足条件的数据,如果不指定where子句,那么删除表中所有记录。delete语句不影响表所占用的extent(就是表结构的中的区),高水线(high watermark)保持原位置不变。 (高水位线就存在于段(segment)中,它用于标识段中已使用过的数据块与未使用的数据块二者间交界,扫描表数据的时候,高水位线以下的所有数据块都必须被扫描。)删除表中数据而不删除表的结构(定义),同时也不释放空间。如果删除大数据量的表速度会很慢。 truncate: 1、只能操作表,将表中数据全部删除,在功能上和不带where子句的delete语句相同:

truncate table table_name;

 2、说明: truncate是DDL(data define language)即操作会立即生效,原数据不会放到rollback segment中,不能回滚,也不会触发触发器truncate会删除表中所有记录,并且将重新设置高水线和所有的索引,缺省情况下将空间释放到minextents的extent(就是表结构中的段内的区域),除非使用reuse storage(使用这句话,所在的extent空间不会被回收,只是将数据删除掉,数据删除之后的freespace空间,只能供本表使用,其他的不可以使用)。不会记录日志,所以执行速度很快,但不能通过rollback撤消操作(如果一不小心把一个表truncate掉,也是可以恢复的,只是不能通过rollback来恢复)。对于外键(foreign key )约束引用的表,不能使用 truncate table(会报错(Cannot truncate a table referenced in a foreign key constraint )),也不能使用drop table(会报错(Cannot delete or update a parent row: a foreign key constraint fails)),而应使用不带 where 子句的 delete 语句。truncate table不能用于参与了索引视图的表。删除内容、释放空间但不删除表的结构(定义)。

 

drop: 1、drop语句将删除表的结构,以及被依赖的约束(constrain),触发器(trigger),索引(index);

drop table table_name;

 2、说明: drop是DDL,会隐式提交,所以,不能回滚,不会触发触发器。drop语句删除表结构及所有数据,并将表所占用的空间全部释放。drop语句将删除表的结构所依赖的约束,触发器,索引,依赖于该表的存储过程/函数将保留,但是变为invalid状态。 总结: delete,drop和truncate的区别:

1、delete是DML语句,操作完以后如果没有不想提交事务还可以进行回滚;truncate和drop是DDL语句,操作完马上生效,不能进行回滚。

delete和truncate仅仅删除表数据,而不删除表的结构(定义),drop将删除表数据和表结构以及表的结构被依赖的约束(constrain),触发器(trigger)索引(index);依赖于该表的存储过程/函数将被保留,但其状态会变为:invalid。delete执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行回滚操作;truncate table则是一次性的从表中删除所有的数据,并不把单独的删除操作记录记入日志保存,删除行是不能进行恢复的。并且在删除的过程中不会激活与表有关的删除触发器。执行速度快。

在没有备份的情况下,谨慎使用drop与truncate。要删除部分数据行采用delete且注意结合where来约束影响范围。回滚段要足够大。要删除表用drop;若想保留表而将表中的数据删除,如果与事务无关,用truncate即可实现。如果和事务有关,或者想触发trigger,还是用delete。

在速度上,一般来说,drop> truncate > delete。

在使用drop和truncate时一定要注意,虽然可以恢复,但为了减少麻烦,还是要慎重。

如果想删除部分数据用delete,注意带上where子句,回滚段要足够大;如果想删除表,当然用drop;

如果想保留表而将所有数据删除,如果和事务无关(不能回滚),用truncate即可;

如果和事务有关,或者想触发trigger,还是用delete;

2、表和索引所占空间

当表被truncate后,这个表和索引所占用的空间恢复到初始大小,delete操作不会减少表或索引所占用的空间。drop语句会将表所占用的空间全释放掉。

3、应用范围:

truncate只能对table;delete可以是table和view

4、truncate和不带where的delete:

truncate table表名 速度快,而且效率高,因为:truncate table在功能上与不带where子句的delete语句相同,二者都是删除表中的所有行。但truncate table 比delete速度快,且使用的系统和事务日志资源少。delete语句每次删除一行,并在事务日志中为所删除的每行记录一项。TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。 

TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用 DELETE。delete from删空表后,会保留一个空的页,truncate在表中不会留有任何页。如果要删除表定义及其数据,请使用 DROP TABLE 语句。 

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

当使用行锁执行 DELETE 语句时,将锁定表中各行以便删除。truncate始终锁定表和页,而不是锁定各行。

如果有identity产生的自增id列,delete from后仍然从上次的数开始增加,即种子不变;使用truncate删除之后,种子会恢复到初始值。

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



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有