drop,truncate,delete 三者的区别

drop:删除内容和定义,释放空间。(表结构和数据一同删除)

【drop语句将删除表的结构,被依赖的约束(constrain),(trigger)索引(index);依赖于该表的存储过程/函数将被保留,但其状态会变为:invalid。】

drop table user;

truncate:删除内容,释放空间,但不删除定义。(表结构还在,数据删除)

【truncate table 权限默认授予表所有者、sysadmin 固定服务器角色成员、db_owner 和 db_ddladmin 固定数据库角色成员且不可转让。】

truncate table user;

delete:删除内容,不删除定义,也不释放空间。

delete from user;

注:user 为数据库表名

三者的执行速度,一般来说:drop > truncate > delete

释放空间可以体现在:

通过delete删除的行数据是不释放空间的,如果表id是递增式的话,那么表数据的id就可能不是连续的;而通过truncate删除数据是释放空间的,如果表id是递增式的话,新增数据的id又是从头开始,而不是在已删数据的最大id值上递增。

delete from user 与 truncate table user ,虽然同样是删除user表的数据,但却有很大的区别:

1、delete from user 在删除数据时,是一行数据一行数据地删除,每删除一行数据,就在事务日志中为删除的那行数据做一项记录,因此可对delete操作进行回滚(roll back); truncate table user 在删除数据时,是通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放; 因此,truncate 的执行速度比 delete 快,且使用的系统和事务日志资源少(在表数据越多的情况下对比更明显); 不过,在执行回滚命令时,delete 将被撤销,而 truncate 则不会别撤销。

2、delete 可以删除部分行数据, truncate 只能删除表中所有数据。

3、delete语句是数据库操作语言(dml),这个操作会放到 rollback segement 中,事务提交之后才生效;如果有相应的触发器(trigger),执行的时候将被激活。 truncate、drop 是数据库定义语言(ddl),操作立即生效,原数据不放到 rollback segment 中,不能回滚,操作不激活 触发器(trigger)。

4、truncate 在删除表中的所有行后,表的结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用delete。

5、truncate 将重新设置高水平线和所有的索引。在对整个表和索引进行完全浏览时,经过 truncate 操作后的表比Delete操作后的表要快得多。

6、当表被清空后表和表的索引讲重新设置成初始大小,而delete则不能。

7、truncate 不能清空父表。

8、truncate 不能用于参与了索引视图的表。

注:在什么情况下,使用 delete 而不使用 truncate ?

1、当只要删除表中部分数据时,使用 delete ,因为 truncate 只能清空表中所有数据;

2、当要删除数据的表中存在外键(foreign key)约束时,应使用 delete,不能使用 truncate,因为 truncate 操作不能激活 触发器(trigger)。

区别 Delete Truncate Drop SQL类型 属于DML 属于DDL 属于DDL 支持回滚 支持 不支持 不支持 删除内容 表结构还在,删除表的全部或部分数据 表结构还在,删除表中所有数据 从数据库中删除表的所有数据,包括索引和权限 执行速度 速度慢,需要逐行删除 速度快 速度最快
经验分享 程序员 微信小程序 职场和发展