Mysql中Truncate⽤法详解
前⾔:
1.当我们想要清空某张表时,往往会使⽤truncate语句。⼤多时候我们只关⼼能否满⾜需求,⽽不去想这类语句的使⽤场景及注意事项。本篇⽂章主要介绍truncate语句的使⽤⽅法及注意事项。
truncate的作⽤是清空表或者说是截断表,只能作⽤于表。truncate的语法很简单,后⾯直接跟表名即可,例如: truncate table tbl_name 或者 truncate tbl_name 。
执⾏truncate语句需要拥有表的drop权限,从逻辑上讲,truncate table类似于delete删除所有⾏的语句或drop table然后再create table语句的组合。
为了实现⾼性能,它绕过了删除数据的DML⽅法,因此,它不能回滚。尽管truncate table与delete相似,但它被分类为DDL语句⽽不是DML语句。
上⾯说过truncate与delete,drop很相似,其实这三者还是与很⼤的不同的,下⾯简单对⽐下三者的异同。
truncate与drop是DDL语句,执⾏后⽆法回滚;delete是DML语句,可回滚。
truncate只能作⽤于表;delete,drop可作⽤于表、视图等。
truncate会清空表中的所有⾏,但表结构及其约束、索引等保持不变;drop会删除表的结构及其所依赖的约束、索引等。
truncate会重置表的⾃增值;delete不会。
truncate不会激活与表有关的删除触发器;delete可以。
truncate后会使表和索引所占⽤的空间会恢复到初始⼤⼩;delete操作不会减少表或索引所占⽤的空间,drop语句将表所占⽤的空间全释放掉。
TRUNCATE 关键字⽤于完全清空⼀个表。其语法格式如下:mysql语句分类
TRUNCATE [TABLE] 表名
其中,TABLE 关键字可省略。
例 1
新建表 tb_student_course,插⼊数据并查询,SQL 语句和运⾏结果如下:
mysql> CREATE TABLE `tb_student_course` (
-> `id` int(4) NOT NULL AUTO_INCREMENT,
-> `name` varchar(25) NOT NULL,
-> PRIMARY KEY (`id`)
登录oracle系统错误-> );浮点数尾数
Query OK, 0 rows affected (0.04 sec)
mysql> INSERT INTO tb_student_course(name) VALUES ('Java'),('MySQL'),('Python');
Query OK, 3 rows affected (0.05 sec)
Records: 3  Duplicates: 0  Warnings: 0
mysql> SELECT * FROM tb_student_course;
+----+--------+
| id | name  |
+----+--------+
|  1 | Java  |
|  2 | MySQL  |
|  3 | Python |
+----+--------+
strncpy和strcpy一样吗
3 rows in set (0.00 sec)
使⽤ TRUNCATE 语句清空 tb_student_course 表中的记录,SQL 语句和运⾏结果如下:
mysql> TRUNCATE TABLE tb_student_course;
Query OK, 0 rows affected (0.04 sec)
mysql> SELECT * FROM tb_student_course;
Empty set (0.00 sec)
TRUNCATE 和 DELETE 的区别(再次强调)
从逻辑上说,TRUNCATE 语句与 DELETE 语句作⽤相同,但是在某些情况下,两者在使⽤上有所区别。
DELETE 是 DML 类型的语句;TRUNCATE 是 DDL 类型的语句。它们都⽤来清空表中的数据。
DELETE 是逐⾏⼀条⼀条删除记录的;TRUNCATE 则是直接删除原来的表,再重新创建⼀个⼀模⼀样的新表,⽽不是逐⾏删除表中的数据,执⾏数据⽐ DELETE 快。  因此需要删除表中全部的数据⾏时,尽量使⽤ TRUNCATE 语句,可以缩短执⾏时间。
DELETE 删除数据后,配合事件回滚可以回数据;TRUNCATE 不⽀持事务的回滚,数据删除后⽆法回。
写出osi参考模型DELETE 删除数据后,系统不会重新设置⾃增字段的计数器;TRUNCATE 清空表记录后,系统会重新设置⾃增字段的计数器。
DELETE 的使⽤范围更⼴,因为它可以通过 WHERE ⼦句指定条件来删除部分数据;⽽ TRUNCATE 不⽀持 WHERE ⼦句,只能删除整体。
DELETE 会返回删除数据的⾏数,但是 TRUNCATE 只会返回0,没有任何意义。
  通过前⾯介绍,我们很容易得出truncate语句的使⽤场景,即该表数据完全不需要时可以⽤truncate。汇编程序是指
  如果想删除部分数据⽤delete,注意带上where⼦句;如果想删除表,当然⽤drop;如果想保留表⽽将所有数据删除且和事务⽆关,⽤truncate即可;
  如果和事务有关,或者想触发trigger,还是⽤delete;如果是整理表内部的碎⽚,可以⽤truncate然后再重新插⼊数据。
⽆论怎样,truncate表都是⾼危操作,特别是在⽣产环境要更加⼩⼼,下⾯列出⼏点注意事项,希望⼤家使⽤时可以做下参考。truncate⽆法通过binlog回滚。
truncate会清空所有数据且执⾏速度很快。
truncate不能对有外键约束引⽤的表使⽤。
执⾏truncate需要drop权限,不建议给账号drop权限。
执⾏truncate前⼀定要再三检查确认,最好提前备份下表数据。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。