您现在的位置: 365建站网 > 365学习 > mysql清空表中truncate与delete的用法和区别

mysql清空表中truncate与delete的用法和区别

文章来源:365jz.com     点击数:139    更新时间:2021-03-14 20:37   参与评论

mySQL清空表中truncate与delete都是删除表的操作,但还是有些许不同。

delete和truncate区别如下:

一、灵活性:delete可以条件删除数据,而truncate只能删除表的所有数据;

delete * from table_name;

delete from table_test where ... 

truncate table table_test 

注 : truncate操作中的table可以省略,delete操作中的*可以省略

 delete是一条一条删除记录的,配合事件(transaction)和回滚(rollback)可以找回数据,且自增(auto_increment)不会重置。
 truncate则是直接删除整个表,再重新创建一个一模一样的新表,auto_increment会被重置,且数据无法找回。

二、效率:delete效率低于truncate,delete是一行一行地删除,truncate会重建表结构,

三、事务:truncate是DDL语句,需要drop权限,因此会隐式提交,不能够rollback;delete是DML语句,可以使用rollback回滚。

四、触发器:truncate 不能触发任何Delete触发器;而delete可以触发delete触发器。

1> truncate 是整体删除 (速度较快),delete是逐条删除 (速度较慢)
2> truncate 不写服务器 log,delete 写服务器 log,也就是 truncate 效率比 delete高的原因
3> truncate 不激活trigger (触发器),但是会重置Identity (标识列、自增字段),相当于自增列会被置为初始值,又重新从1开始记录,而不是接着原来的 ID数。而 delete 删除以后,identity 依旧是接着被删除的最近的那一条记录ID加1后进行记录。如果只需删除表中的部分记录,只能使用 DELETE语句配合 where条件
mysql> select * from students_bak;
+-----+----------+--------+---------+
| sid | sname    | gender | dept_id |
+-----+----------+--------+---------+
| 101 | zhangsan | male   |      10 |
|   1 | aa       | 1      |       1 |
+-----+----------+--------+---------+
2 rows in set (0.00 sec)
mysql> truncate table students_bak;
Query OK, 0 rows affected (0.16 sec)
mysql> select * from students_bak;
Empty set (0.00 sec)
mysql> set autocommit=off;
Query OK, 0 rows affected (0.01 sec)
mysql> select * from students3;
+-----+-------+--------+---------+--------+
| sid | sname | gender | dept_id | sname2 |
+-----+-------+--------+---------+--------+
| 100 | NULL  | 1      |       1 | NULL   |
+-----+-------+--------+---------+--------+
1 row in set (0.01 sec)
mysql> truncate table students3;
Query OK, 0 rows affected (0.06 sec)
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from students3;
Empty set (0.00 sec)
mysql> delete from students;
Query OK, 5 rows affected (0.00 sec)
mysql> select * from students;
Empty set (0.00 sec)
mysql> rollback;
Query OK, 0 rows affected (0.07 sec)
mysql> select * from students;
+-----+-------+--------+---------+
| sid | sname | gender | dept_id |
+-----+-------+--------+---------+
|   1 | aa    | 3      |       1 |
|   4 | cc    | 3      |       1 |
|   5 | dd    | 1      |       2 |
|   6 | aac   | 1      |       1 |
|  10 | a     | 1      |       1 |
+-----+-------+--------+---------+
5 rows in set (0.00 sec)



如对本文有疑问,请提交到交流论坛,广大热心网友会为你解答!! 点击进入论坛


发表评论 (139人查看0条评论)
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码: 点击我更换图片
最新评论
------分隔线----------------------------