delete from和truncate table的区别

在mysql中,删除表的常见方式有两种:
(1)delete from语句,
(2)truncate table语句。


delete from语句可以和条件查询的where配合使用,用于筛选需要删除的内容

(例如:delete from test_zxk where id > 8 order by id desc limit 2;),总的来说delete from的语句更加灵活。

使用语句:delete FROM table1 WHERE ;
而truncate table是删除表中的所有记录。

truncate (table可选)  tablename ;


二者之间的区别主要有以下几点:

(1)如果delete不加WHERE子句,那么它和truncate table的执行当前效果是一样的,但它们有一点不同,那就是delete可以返回被删除的记录数,而truncate table返回的是0。

mysql> select * from test_zxk;

+----+-------+

| id | value |

+----+-------+

|  1 | a     |

|  2 | b     |

|  3 | c     |

|  5 | a     |

|  7 | b     |

|  9 | c     |

| 10 | a     |

| 11 | b     |

| 12 | c     |

+----+-------+

9 rows in set (0.04 sec)


mysql> delete from  test_zxk;

Query OK, 9 rows affected (0.04 sec)


mysql> insert into test_zxk (value) values ('a'), ('b'), ('c');

Query OK, 3 rows affected (0.04 sec)

Records: 3  Duplicates: 0  Warnings: 0


mysql> select * from test_zxk;

+----+-------+

| id | value |

+----+-------+

| 13 | a     |

| 14 | b     |

| 15 | c     |

+----+-------+

3 rows in set (0.04 sec)




mysql> select * from test_zxk;

+----+-------+

| id | value |

+----+-------+

|  1 | a     |

|  2 | b     |

|  3 | c     |

|  4 | a     |

|  5 | b     |

|  6 | c     |

+----+-------+

6 rows in set (0.04 sec)


mysql> truncate test_zxk;

Query OK, 0 rows affected (0.13 sec)


mysql> insert into test_zxk (value) values ('a'), ('b'), ('c');

Query OK, 3 rows affected (0.04 sec)

Records: 3  Duplicates: 0  Warnings: 0


mysql> select * from test_zxk;

+----+-------+

| id | value |

+----+-------+

|  1 | a     |

|  2 | b     |

|  3 | c     |

+----+-------+

3 rows in set (0.04 sec)



但是truncate删除后将重新水平线和索引(id从零开始) ,delete不会删除索引,所以对下次插入的序号影响是不一样的,通过delete方式删除的数据下次主键id值是基于上一次主键id值产生,而通过truncate方式删除后下次主键id值是从1产生

(2)使用delete语句时,可以加上永真的WHERE,如WHERE 1或WHERE true。 
delete FROM table1 WHERE 1;

上面的语句在执行时将扫描每一条记录。但它并不比较,因为这个WHERE条件永远为true。这种情况下会扫描了所有的记录,因此,它的执行成本要比没有WHERE子句的delete大得多。

如果使用truncate table是删除表中的所有数据, 尤其是表中有大量的数据, 使用truncate table是将表结构重新建一次速度要比使用delete from快很多,而delete from是一行一行的删除,速度很慢。

(3)事务方面:由于truncate删除整表数据(ddl语句,隐式提交),delete是一行一行的删除,所以 truncate是不可以rollback的,但是delete是可以rollback的;
(4)触发器方面: truncate 不能触发任何Delete触发器。 

0
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值