|
|
楼主 |
发表于 2021-11-18 19:29:42
|
显示全部楼层
TRUNCATE 关键字用于完全清空一个表。其语法格式如下:
& M% S5 k+ R9 _% O5 P# t0 e
/ b3 V1 g" W; l- j8 iTRUNCATE [TABLE] 表名' f3 p! q& p0 @4 K) j0 l) j
其中,TABLE 关键字可省略。
0 v b. q9 i5 T, V2 X- x( u0 ~2 u$ h! Z2 E: J) Q5 a
例 1
3 F+ J5 L1 L* M+ f: g0 n L新建表 tb_student_course,插入数据并查询,SQL 语句和运行结果如下:
% Q6 S7 E4 T7 G, z% I* z
3 ]% X7 c9 \2 n$ Z) @复制代码
# Y2 L9 v W6 lmysql> CREATE TABLE `tb_student_course` (- ^6 G& d2 a- L' H
-> `id` int(4) NOT NULL AUTO_INCREMENT,! s0 `" f! X+ ]& W* } x& @
-> `name` varchar(25) NOT NULL,
/ ?2 j6 K/ b$ p' l6 r9 m& c -> PRIMARY KEY (`id`)
: Z- H! V2 P' z Z -> );: q4 {5 [! Q7 k$ ~ J
Query OK, 0 rows affected (0.04 sec)2 t# t7 T- x& D4 j
8 C2 o1 _& l0 Q8 _& Qmysql> INSERT INTO tb_student_course(name) VALUES ('Java'),('MySQL'),('Python');
6 ? K5 r. ~* b- RQuery OK, 3 rows affected (0.05 sec)$ x3 E0 |% n& ?% T+ k( S# \5 V
Records: 3 Duplicates: 0 Warnings: 0
( Z! ?4 |5 c4 N& @
2 r6 g3 A3 b6 k$ w3 Lmysql> SELECT * FROM tb_student_course;
# h! M7 Q. s: Z! D7 p) Q) l+----+--------+) M0 k! |/ V) v$ }- J
| id | name |
( J4 h$ M( _8 ~1 w- T2 Y+----+--------+
- G# H/ A# P' Q: F' A| 1 | Java |
+ r" H- o$ h# f1 `. \& Y6 U| 2 | MySQL |% A5 l: \1 {5 s
| 3 | Python |
. A& m3 ~ i* e( q+----+--------+& O3 ~* N) m& d$ v9 M$ Y
3 rows in set (0.00 sec)
+ L* d0 z+ I# z" F/ a# R* O复制代码
. e @5 B( T: |; }2 a使用 TRUNCATE 语句清空 tb_student_course 表中的记录,SQL 语句和运行结果如下:/ X4 q a4 g- o: s
) a# F9 J1 q# }, _4 s& j0 y$ ?mysql> TRUNCATE TABLE tb_student_course;
2 I: X0 O! f/ z$ KQuery OK, 0 rows affected (0.04 sec)& P- G- ^& M" D* n2 N
1 y, H& {" ]2 |& {9 Z1 |1 umysql> SELECT * FROM tb_student_course;
, ?: _' w( v, ^3 PEmpty set (0.00 sec)- f5 a h- ?! a: P' X2 T! K
复制代码0 A$ `4 o0 E1 U
TRUNCATE 和 DELETE 的区别(再次强调)
; A! \+ b$ H2 |8 @从逻辑上说,TRUNCATE 语句与 DELETE 语句作用相同,但是在某些情况下,两者在使用上有所区别。
/ A" b$ F1 N# a6 lDELETE 是 DML 类型的语句;TRUNCATE 是 DDL 类型的语句。它们都用来清空表中的数据。. U' [, j' E5 j5 F) e
DELETE 是逐行一条一条删除记录的;TRUNCATE 则是直接删除原来的表,再重新创建一个一模一样的新表,而不是逐行删除表中的数据,执行数据比 DELETE 快。
, `& |& ~! ?) a! S3 g 因此需要删除表中全部的数据行时,尽量使用 TRUNCATE 语句, 可以缩短执行时间。
2 I) F2 P! Q$ {+ O1 Q' sDELETE 删除数据后,配合事件回滚可以找回数据;TRUNCATE 不支持事务的回滚,数据删除后无法找回。0 w% ?* @ H9 I# t) F
DELETE 删除数据后,系统不会重新设置自增字段的计数器;TRUNCATE 清空表记录后,系统会重新设置自增字段的计数器。
% {* O( d: j o7 B4 N" ADELETE 的使用范围更广,因为它可以通过 WHERE 子句指定条件来删除部分数据;而 TRUNCATE 不支持 WHERE 子句,只能删除整体。* z2 T6 \, U* o: N
DELETE 会返回删除数据的行数,但是 TRUNCATE 只会返回 0,没有任何意义。
) c1 b6 U C. ^复制代码
6 I5 F* Z) ^$ b( Z3.truncate使用场景及注意事项
; w9 Z+ F8 _9 x/ y1 F 通过前面介绍,我们很容易得出truncate语句的使用场景,即该表数据完全不需要时可以用truncate。
6 G9 W, |! K/ l2 E2 z1 b+ e
! x3 ?2 W" ]( r8 {; W3 `8 O 如果想删除部分数据用delete,注意带上where子句;如果想删除表,当然用drop;如果想保留表而将所有数据删除且和事务无关,用truncate即可;
$ `; U0 y ?# `+ \
; H7 }1 }4 E% c: J1 b g 如果和事务有关,或者想触发trigger,还是用delete;如果是整理表内部的碎片,可以用truncate然后再重新插入数据。+ j0 Q5 y9 p- ?, a& L e
9 v }" Z& O+ f' Y
无论怎样,truncate表都是高危操作,特别是在生产环境要更加小心,下面列出几点注意事项,希望大家使用时可以做下参考。
9 `; F- h1 l$ s; i- x2 K# G/ @: F5 ~, `
truncate无法通过binlog回滚。 a3 V+ {5 Q: x- O
truncate会清空所有数据且执行速度很快。& }1 A2 A" N4 c' d
truncate不能对有外键约束引用的表使用。
6 j/ p8 R# ]5 V, u3 Q执行truncate需要drop权限,不建议给账号drop权限。" U) M7 j. @( O! f" l( g. p9 P
执行truncate前一定要再三检查确认,最好提前备份下表数据。 |
|