|
|
楼主 |
发表于 2021-11-18 19:29:42
|
显示全部楼层
TRUNCATE 关键字用于完全清空一个表。其语法格式如下:
% S0 V* C- x$ ~) |% i6 }3 H
; G' D# E! R+ c, R3 {( n8 ^5 |TRUNCATE [TABLE] 表名0 x( j1 i1 \0 u# p
其中,TABLE 关键字可省略。2 L% W7 Q. O; A2 \; d
5 n9 @7 V2 U8 q/ P( @1 d例 1
# ]8 \6 P3 h" n+ t新建表 tb_student_course,插入数据并查询,SQL 语句和运行结果如下:
2 O! P' B' x% s0 B" [5 C7 ]" N' o( y# u
复制代码, F: Y& K# P7 R& E$ n
mysql> CREATE TABLE `tb_student_course` (' ?- M; S1 P: ?& o% i- C$ K1 _
-> `id` int(4) NOT NULL AUTO_INCREMENT,
' ?5 d, F2 H/ k U7 b. ?! y -> `name` varchar(25) NOT NULL,
) [- {, R+ w( |, {" E; s: e5 {8 u -> PRIMARY KEY (`id`)3 G; }; V1 ^$ o) d2 K7 A, H1 U0 a
-> );- A( U; m" R& N& M+ Z% @
Query OK, 0 rows affected (0.04 sec). P8 ~* q) k; M' A( S. E
6 a. @/ H. l* i$ Dmysql> INSERT INTO tb_student_course(name) VALUES ('Java'),('MySQL'),('Python');
" G' R6 A: G/ V! o) L7 PQuery OK, 3 rows affected (0.05 sec)1 C$ ^+ r4 q" Q
Records: 3 Duplicates: 0 Warnings: 0# q5 G" B0 M& r. q$ c! O
7 A6 \ k& X- w# Vmysql> SELECT * FROM tb_student_course;
4 N0 U/ M& |, A& U0 n( ?& e2 x+----+--------+
1 ]; [& D9 r4 J' V| id | name |
- ^9 ], e1 z0 j O+----+--------+
% `" @4 f# ]8 M: V- S| 1 | Java |
3 O+ @. O& T Z7 u1 w| 2 | MySQL |* P; |8 Q0 Q# g( j
| 3 | Python |
/ q- {. j* j$ A+----+--------+( _/ a+ n' @# _
3 rows in set (0.00 sec)0 a8 `; \" F6 ^' F3 n2 a7 M
复制代码
, i" S$ T- _+ m$ |' d使用 TRUNCATE 语句清空 tb_student_course 表中的记录,SQL 语句和运行结果如下:
( L! W1 E E! W- k3 W( Y/ |3 d) |- Z
mysql> TRUNCATE TABLE tb_student_course;
5 }7 q) ?& Q5 MQuery OK, 0 rows affected (0.04 sec)
( O: |% `: [% g0 @ D+ K
/ v4 U4 T! ]& E* ~$ h) n7 Emysql> SELECT * FROM tb_student_course;
2 A. y( O ?1 z AEmpty set (0.00 sec) n) \7 e( |. K/ m
复制代码% p2 a* l) n' |$ }
TRUNCATE 和 DELETE 的区别(再次强调)
C6 x& [! R+ C% B1 a3 ^& g从逻辑上说,TRUNCATE 语句与 DELETE 语句作用相同,但是在某些情况下,两者在使用上有所区别。
8 e0 J# J$ ^6 b# T: bDELETE 是 DML 类型的语句;TRUNCATE 是 DDL 类型的语句。它们都用来清空表中的数据。1 m' C. b; U2 G7 Z. W
DELETE 是逐行一条一条删除记录的;TRUNCATE 则是直接删除原来的表,再重新创建一个一模一样的新表,而不是逐行删除表中的数据,执行数据比 DELETE 快。0 A0 p9 u1 W6 r- X
因此需要删除表中全部的数据行时,尽量使用 TRUNCATE 语句, 可以缩短执行时间。
* C/ F; o7 |; T! H( VDELETE 删除数据后,配合事件回滚可以找回数据;TRUNCATE 不支持事务的回滚,数据删除后无法找回。: d: A: ]2 K) n0 p
DELETE 删除数据后,系统不会重新设置自增字段的计数器;TRUNCATE 清空表记录后,系统会重新设置自增字段的计数器。% l, t7 w3 d2 L
DELETE 的使用范围更广,因为它可以通过 WHERE 子句指定条件来删除部分数据;而 TRUNCATE 不支持 WHERE 子句,只能删除整体。
* h! {: x6 Z4 oDELETE 会返回删除数据的行数,但是 TRUNCATE 只会返回 0,没有任何意义。
6 x* s4 Q! w: ^1 L' d2 K. O复制代码3 I p4 k3 q4 p& i& J; f% l7 T
3.truncate使用场景及注意事项
& P+ F$ N* y" P8 j& t: M 通过前面介绍,我们很容易得出truncate语句的使用场景,即该表数据完全不需要时可以用truncate。
" ^. V: G, q1 `5 c& B% C/ o
3 p. U8 [! N i5 f7 m; X 如果想删除部分数据用delete,注意带上where子句;如果想删除表,当然用drop;如果想保留表而将所有数据删除且和事务无关,用truncate即可;
# y' @ d$ x: ?! _% F6 `
4 H i H% G. F$ H 如果和事务有关,或者想触发trigger,还是用delete;如果是整理表内部的碎片,可以用truncate然后再重新插入数据。
9 o# j7 u) h! P, f/ M' u
" ]+ j# F0 i+ d2 F q无论怎样,truncate表都是高危操作,特别是在生产环境要更加小心,下面列出几点注意事项,希望大家使用时可以做下参考。/ G6 [" {3 W4 Q" u
8 t$ L; ~0 s I
truncate无法通过binlog回滚。' |7 R( M/ g& L: N3 ~: C/ [7 H
truncate会清空所有数据且执行速度很快。
# Y n$ I' A6 K' O' a8 Itruncate不能对有外键约束引用的表使用。
& q' m- }) B, V$ ~执行truncate需要drop权限,不建议给账号drop权限。' r* B. _. l8 R1 \4 |5 n) p# T1 ~
执行truncate前一定要再三检查确认,最好提前备份下表数据。 |
|