|
|
楼主 |
发表于 2021-11-18 19:29:42
|
显示全部楼层
TRUNCATE 关键字用于完全清空一个表。其语法格式如下:
1 P' m$ k! k' [/ D
0 c" ], M# E) r- E* u+ ]& t. }: KTRUNCATE [TABLE] 表名
& Q' Q6 y- p2 ]" r K5 T B! K其中,TABLE 关键字可省略。
4 Q% @+ u1 D6 C* X% _
( ^, Q- E! t8 v- V6 ]8 b) q" o例 1
' F8 L( j( c* ~8 B3 w1 x新建表 tb_student_course,插入数据并查询,SQL 语句和运行结果如下:: @6 j6 T* Q. f3 |; @
4 u7 H2 `/ G( _9 P" ?; o
复制代码
7 t9 g3 P$ X3 Hmysql> CREATE TABLE `tb_student_course` (
. V9 u$ {& h$ ]. f -> `id` int(4) NOT NULL AUTO_INCREMENT,# \2 @8 \, k7 y/ ]
-> `name` varchar(25) NOT NULL,
0 `- m% |) C o3 u- V. o& G2 I& J; r -> PRIMARY KEY (`id`)
, R& O. X. I O% B' a$ _- M+ S4 ? -> );, q& H; R% b9 h
Query OK, 0 rows affected (0.04 sec)
( ~2 I: {* b- O
. h$ w4 ^8 m0 j4 vmysql> INSERT INTO tb_student_course(name) VALUES ('Java'),('MySQL'),('Python');
, Q& e. V9 l. p5 J8 YQuery OK, 3 rows affected (0.05 sec)1 l' v" B9 |8 b. A+ V4 h1 E
Records: 3 Duplicates: 0 Warnings: 0; l1 E* l1 N( }/ p: B
, Q) P: r, V3 V2 }( {mysql> SELECT * FROM tb_student_course;
/ U) @6 y" Z5 v' K9 C/ c# f+----+--------+
1 a0 n$ w4 }. w/ a| id | name |
- t& r0 g; E/ w) R( N+----+--------+, m' x2 c6 ` n5 k5 P
| 1 | Java |2 v& } R! o# J7 A5 y
| 2 | MySQL |4 S$ m+ h5 b+ d$ i& P
| 3 | Python |! z! }' r% t6 U8 Q1 e
+----+--------+% I% P' Q: k X- I( n
3 rows in set (0.00 sec)
4 G3 i% k+ M( k复制代码
- I+ P/ M/ c- H% j7 F; d0 |使用 TRUNCATE 语句清空 tb_student_course 表中的记录,SQL 语句和运行结果如下:
2 u8 U9 k6 y+ y- k3 E3 k9 C* b$ f# w: h
mysql> TRUNCATE TABLE tb_student_course;
/ U) K1 a% c# o/ v, h$ B" hQuery OK, 0 rows affected (0.04 sec)
; H' o+ I6 Q( ?( B, W/ d( r& o! W/ i2 k' R! g5 j1 `# X
mysql> SELECT * FROM tb_student_course;$ [. f: Z9 j8 V. _0 i; F
Empty set (0.00 sec)1 H4 z8 x# o0 p0 i. \
复制代码5 W9 }6 c/ s2 k/ f( E
TRUNCATE 和 DELETE 的区别(再次强调)
( j4 K9 F% j$ M. d$ F, K2 ?6 x7 F从逻辑上说,TRUNCATE 语句与 DELETE 语句作用相同,但是在某些情况下,两者在使用上有所区别。5 n# M* J3 T" @. g8 t' A: \
DELETE 是 DML 类型的语句;TRUNCATE 是 DDL 类型的语句。它们都用来清空表中的数据。2 J/ g- j e" d% j4 J% r+ V: D
DELETE 是逐行一条一条删除记录的;TRUNCATE 则是直接删除原来的表,再重新创建一个一模一样的新表,而不是逐行删除表中的数据,执行数据比 DELETE 快。
0 A {/ S _* |: E5 {5 v6 a% j; V 因此需要删除表中全部的数据行时,尽量使用 TRUNCATE 语句, 可以缩短执行时间。: t( ~8 s, A6 j
DELETE 删除数据后,配合事件回滚可以找回数据;TRUNCATE 不支持事务的回滚,数据删除后无法找回。
: I0 J0 X" Z, f" v# }. ^DELETE 删除数据后,系统不会重新设置自增字段的计数器;TRUNCATE 清空表记录后,系统会重新设置自增字段的计数器。2 L3 ^/ e* Q" J) B5 F
DELETE 的使用范围更广,因为它可以通过 WHERE 子句指定条件来删除部分数据;而 TRUNCATE 不支持 WHERE 子句,只能删除整体。' Q- Z! Q" C' u4 u- z3 G& C! x
DELETE 会返回删除数据的行数,但是 TRUNCATE 只会返回 0,没有任何意义。- M8 h7 {# A& q8 `+ @7 U
复制代码
, d; h0 r: r9 C$ h3.truncate使用场景及注意事项
( L& T6 W: q9 `) ~' B 通过前面介绍,我们很容易得出truncate语句的使用场景,即该表数据完全不需要时可以用truncate。
8 Q( E: k+ _$ o1 _! I. Z" L7 _& N' ^: [! N" s! a
如果想删除部分数据用delete,注意带上where子句;如果想删除表,当然用drop;如果想保留表而将所有数据删除且和事务无关,用truncate即可;! a* A! |, O0 N2 q
0 P9 W; I3 J S2 h" `7 ] 如果和事务有关,或者想触发trigger,还是用delete;如果是整理表内部的碎片,可以用truncate然后再重新插入数据。
[, G3 q/ h& |* j G& P
2 e' l$ I$ N9 v6 C" G- `$ c无论怎样,truncate表都是高危操作,特别是在生产环境要更加小心,下面列出几点注意事项,希望大家使用时可以做下参考。
% \: c3 M6 H/ v$ F: n: h0 a ]& J8 t8 ?) w% a- t6 i2 ]
truncate无法通过binlog回滚。3 _( V5 z* F5 g8 B( r
truncate会清空所有数据且执行速度很快。. d$ c- A: U/ a3 f2 K b0 Y6 k
truncate不能对有外键约束引用的表使用。. Z/ f- X/ m+ x. I
执行truncate需要drop权限,不建议给账号drop权限。
& k3 [9 a3 k `执行truncate前一定要再三检查确认,最好提前备份下表数据。 |
|