两者都可以删除表中的数据,但是本质上是有区别的,两者使用方法如下:
--删除表中所有数据
DELETE FROM table_name;
--删除表中部分符合条件的数据
DELETE FROM table_name WHERE 【】;--删除表中所有数据
TRUNACTE TABLE table_name;
1、SQL语言上的区别
delete
:属于 DML(数据操作语言) 范畴truncate
:属于 DDL(数据定义语言) 范畴
2、操作对象不同
- delete:操作对象是表中的每行数据,属于行级别。可以通过在后面添加where条件删除部分数据。
- truncate:操作对象是表,不能加where条件,一执行就是删除了整个表。
3、是否会释放空间和能否回滚
- delete:删除的行数据是不释放空间的,每删除一行数据,就在事务日志中为删除的那行数据做一项记录,因此可对delete操作进行回滚(roll back);如果表id是递增式的话,那么表数据的id就可能不是连续的;
- truncate:是通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放,所以删除不能回滚。
4、删除效率
- delete:逻辑删除,走事务,有binlog记录,必然效率慢
- truncate:物理删除,直接删除存储数据的数据页,不走事务没有日志记录,必然快。
5、外检约束
- delete:可以通过sql语句,根据外键有序的删除本表和相关表中的数据。比如删除部门表中的数据,也可以吧用户表中的数据关联删除。
- truncate:存在外键约束,则删除失败。比如员工表关联了部门表,即使员工表中没有数据,只要外键关联存在,部门表就删不掉。
6、使用场景
慎用、慎用 truncate,删除一些备份表,和测试表也要慎用,别写错表名了。