- 积分
- 16843
在线时间 小时
最后登录1970-1-1
|

楼主 |
发表于 2021-11-18 19:29:42
|
显示全部楼层
TRUNCATE 关键字用于完全清空一个表。其语法格式如下:
" l7 R1 G: w/ t! G1 J& z7 q, O K4 d6 E$ H/ q
TRUNCATE [TABLE] 表名; G% Q, f7 J. D5 X0 z4 T
其中,TABLE 关键字可省略。8 ?8 h5 B' \ r: U$ u+ ~
2 C; |% f7 ]4 {例 19 ]# V7 l# m5 j& Q6 T6 Q7 t2 G$ C% G
新建表 tb_student_course,插入数据并查询,SQL 语句和运行结果如下:& U. x; p6 ]( t: n6 c
& Z" A2 J5 A) f5 D
复制代码 n: P! Y& o* m( l
mysql> CREATE TABLE `tb_student_course` (6 m. {. I6 B4 h5 I- {
-> `id` int(4) NOT NULL AUTO_INCREMENT,
6 V3 I( y+ ]& S. `2 u7 W -> `name` varchar(25) NOT NULL,
3 s( h5 b: q f+ a -> PRIMARY KEY (`id`)
! `+ Z( R3 l7 ~4 m* Q, ] -> );
. W( E$ s1 Y. v, M3 C& \) ZQuery OK, 0 rows affected (0.04 sec)
5 f: p% ?* I' M* M) u( b# p, V* n+ ?
8 ?+ k' j; J# H0 amysql> INSERT INTO tb_student_course(name) VALUES ('Java'),('MySQL'),('Python');; [- d+ R( J/ t1 F* [5 _7 P
Query OK, 3 rows affected (0.05 sec)
$ h1 n7 C, t7 [7 a. Y/ e c5 mRecords: 3 Duplicates: 0 Warnings: 0
1 A5 T$ a1 E f+ f( @
' l2 B' s" V5 W" z) C6 Emysql> SELECT * FROM tb_student_course;
, |1 c; e) f1 |8 O' |/ Q8 }+----+--------+ M1 |& j8 q" S5 @
| id | name |/ p! j& M0 s9 O& [7 I% D: d
+----+--------+
" C3 G4 z1 {* R' K" _| 1 | Java |' H" ?. N& q0 J9 w; p
| 2 | MySQL |( h g% y9 |7 ?, W
| 3 | Python |. x) h& C# f+ G1 @. | x
+----+--------+
4 q4 R5 ^0 K C) K$ F3 rows in set (0.00 sec)) H' G" f- W, g# v) N3 g
复制代码
4 w& ?! O9 J& E$ N0 X使用 TRUNCATE 语句清空 tb_student_course 表中的记录,SQL 语句和运行结果如下:( t. F; @3 U" R* ?' ]0 b
$ N9 u9 h9 v" Z$ B, I2 Mmysql> TRUNCATE TABLE tb_student_course;
" e Y$ @6 [+ J. ~/ C, P! |* u# NQuery OK, 0 rows affected (0.04 sec)
* M) H7 K b+ _. b$ L$ \1 [
4 Q- ^$ l1 w: {2 a& O4 U! Lmysql> SELECT * FROM tb_student_course;' i. I( } P' ~' @) P
Empty set (0.00 sec)
' g$ w5 K! `& j5 r0 m/ D复制代码
5 @+ g0 d9 M) X: O0 v2 w) RTRUNCATE 和 DELETE 的区别(再次强调)& ?- k0 A! a" J6 c% w* g
从逻辑上说,TRUNCATE 语句与 DELETE 语句作用相同,但是在某些情况下,两者在使用上有所区别。% q, r9 y8 x8 G3 v
DELETE 是 DML 类型的语句;TRUNCATE 是 DDL 类型的语句。它们都用来清空表中的数据。
; P3 S5 Z/ _4 a7 S+ v2 n" t- u# ?DELETE 是逐行一条一条删除记录的;TRUNCATE 则是直接删除原来的表,再重新创建一个一模一样的新表,而不是逐行删除表中的数据,执行数据比 DELETE 快。
, B- e/ v6 M& x% {2 S' C% j 因此需要删除表中全部的数据行时,尽量使用 TRUNCATE 语句, 可以缩短执行时间。
. {7 B; Q& _/ A3 d) |) z( jDELETE 删除数据后,配合事件回滚可以找回数据;TRUNCATE 不支持事务的回滚,数据删除后无法找回。 u; w4 h# `( G, U
DELETE 删除数据后,系统不会重新设置自增字段的计数器;TRUNCATE 清空表记录后,系统会重新设置自增字段的计数器。
0 V. v4 }& L$ _: LDELETE 的使用范围更广,因为它可以通过 WHERE 子句指定条件来删除部分数据;而 TRUNCATE 不支持 WHERE 子句,只能删除整体。/ U, Y9 \* Y2 I: ^
DELETE 会返回删除数据的行数,但是 TRUNCATE 只会返回 0,没有任何意义。
0 ~6 |: ~( C& ?- L* J. k6 M) Z复制代码. t8 @& B. c% s6 \% R% P
3.truncate使用场景及注意事项
: ~7 L6 t8 Y7 J- U& I& X' h 通过前面介绍,我们很容易得出truncate语句的使用场景,即该表数据完全不需要时可以用truncate。9 a- t% Q# R- c. R
3 M n0 _: K; _
如果想删除部分数据用delete,注意带上where子句;如果想删除表,当然用drop;如果想保留表而将所有数据删除且和事务无关,用truncate即可;1 e/ e' O7 y# r' d4 m% T q5 @: Q
' h/ J& u7 D _7 }0 m 如果和事务有关,或者想触发trigger,还是用delete;如果是整理表内部的碎片,可以用truncate然后再重新插入数据。
) v6 m Z3 V/ A' S8 Q
0 m% `4 w7 N6 v, p' i8 v$ t6 ]无论怎样,truncate表都是高危操作,特别是在生产环境要更加小心,下面列出几点注意事项,希望大家使用时可以做下参考。: Z4 e. V, m: V( P8 x6 I6 h# J
$ v: F3 C w. \8 r7 N0 A
truncate无法通过binlog回滚。1 o6 A* b9 c) G8 K+ n0 b
truncate会清空所有数据且执行速度很快。' W0 M. P# c9 b- |- C) @1 I7 F
truncate不能对有外键约束引用的表使用。/ L% u8 [& S& l$ F9 n, ^
执行truncate需要drop权限,不建议给账号drop权限。* ?- u+ I% j/ a9 O
执行truncate前一定要再三检查确认,最好提前备份下表数据。 |
|