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

楼主 |
发表于 2021-11-18 19:29:42
|
显示全部楼层
TRUNCATE 关键字用于完全清空一个表。其语法格式如下:/ D- g! {6 e! d( d4 l) I
! @, B" Z8 B2 S+ m5 v8 P- Y
TRUNCATE [TABLE] 表名) A& q& M7 @' I) h+ i
其中,TABLE 关键字可省略。
0 Q( C/ o; c p
4 t, T8 ~' M5 D0 }6 O8 a例 1
$ u& }, ^! v' U, e, P) s% F) i% h" h* D新建表 tb_student_course,插入数据并查询,SQL 语句和运行结果如下:, v. V9 P# A1 Z" N& K4 W. `3 c1 U
t8 u6 d1 h! Z9 N1 l
复制代码
# v/ g4 c' M" Y5 I, smysql> CREATE TABLE `tb_student_course` (2 p% Q0 Y' e" y, J5 ]
-> `id` int(4) NOT NULL AUTO_INCREMENT,1 `) r4 z# x" `# U( Q1 E F
-> `name` varchar(25) NOT NULL,
2 D Z x! v9 Q5 G# ^: S3 Q -> PRIMARY KEY (`id`)
2 n0 w0 [# F6 I! d3 l* r H# Y -> );
4 R Y9 W& H8 a' @8 p# JQuery OK, 0 rows affected (0.04 sec)
# r! t# u/ h+ X: |% { S8 b+ A( c% \" o+ t2 K/ w
mysql> INSERT INTO tb_student_course(name) VALUES ('Java'),('MySQL'),('Python');
+ }! x1 v3 O3 A" LQuery OK, 3 rows affected (0.05 sec)2 Z' s/ F: o3 }& L& N
Records: 3 Duplicates: 0 Warnings: 07 @: D7 N! y: M/ I: R
; Q5 x0 d9 O( V1 Q% }- c# y' }
mysql> SELECT * FROM tb_student_course;
$ u! R! z+ W% E+----+--------+ A. k/ ^- |2 A' W$ M
| id | name |
. [. {8 I! {6 W" d6 j+----+--------+
' r/ f: V9 ^- r; u| 1 | Java |
! e/ O9 Y; d" [0 E' q2 D" F| 2 | MySQL |) ]6 f( b3 k) h W3 g) X: c
| 3 | Python |
' y: |8 c* Q, P; g0 v& Q9 [+----+--------+
" c$ k, [+ a8 B3 rows in set (0.00 sec)- O( L9 i; Z; W/ K9 ]) C
复制代码
2 D( H$ O) c# {; o使用 TRUNCATE 语句清空 tb_student_course 表中的记录,SQL 语句和运行结果如下:& d% M$ P: u. h$ o- t
/ i T k4 ~9 y9 P
mysql> TRUNCATE TABLE tb_student_course;
8 {; J( w- b7 ?5 d: BQuery OK, 0 rows affected (0.04 sec)' Y9 J! ?* {" l7 C j& L. I
% j! v" J! w# J1 h" s; C y4 E
mysql> SELECT * FROM tb_student_course;
% t1 h4 Y( {& Y8 z5 o# n; k+ d4 LEmpty set (0.00 sec)) V Y8 ]3 V# v) G) X" ?
复制代码
, G0 c8 v1 e. L* K. ^TRUNCATE 和 DELETE 的区别(再次强调)
4 A% ~7 m4 _4 \' R: B# f5 F从逻辑上说,TRUNCATE 语句与 DELETE 语句作用相同,但是在某些情况下,两者在使用上有所区别。3 h( X3 B0 X3 T# o, S: s+ v. Y
DELETE 是 DML 类型的语句;TRUNCATE 是 DDL 类型的语句。它们都用来清空表中的数据。* V/ ~5 L/ G' v3 f; m. _
DELETE 是逐行一条一条删除记录的;TRUNCATE 则是直接删除原来的表,再重新创建一个一模一样的新表,而不是逐行删除表中的数据,执行数据比 DELETE 快。3 Z c# o+ p* b1 m# C2 j
因此需要删除表中全部的数据行时,尽量使用 TRUNCATE 语句, 可以缩短执行时间。
# @. r/ C- Q) w1 ~$ t5 S' p0 E1 qDELETE 删除数据后,配合事件回滚可以找回数据;TRUNCATE 不支持事务的回滚,数据删除后无法找回。8 s# C. h0 s, u+ y
DELETE 删除数据后,系统不会重新设置自增字段的计数器;TRUNCATE 清空表记录后,系统会重新设置自增字段的计数器。8 }: ^, F% d3 P- I0 V& X
DELETE 的使用范围更广,因为它可以通过 WHERE 子句指定条件来删除部分数据;而 TRUNCATE 不支持 WHERE 子句,只能删除整体。
% r$ E: M$ p; B8 o/ V! L: c1 ^DELETE 会返回删除数据的行数,但是 TRUNCATE 只会返回 0,没有任何意义。- S2 M6 b. P* l$ g z1 Z' {
复制代码
1 \' k8 g: m' C/ Q: [3.truncate使用场景及注意事项5 o! ^% i+ J6 ?. g. s6 I+ l6 z- _
通过前面介绍,我们很容易得出truncate语句的使用场景,即该表数据完全不需要时可以用truncate。! Q+ G! a9 `- S
' p: \4 r3 f/ A
如果想删除部分数据用delete,注意带上where子句;如果想删除表,当然用drop;如果想保留表而将所有数据删除且和事务无关,用truncate即可;+ r0 Y4 q# h, G" B
# l _# o2 S9 U5 V4 J 如果和事务有关,或者想触发trigger,还是用delete;如果是整理表内部的碎片,可以用truncate然后再重新插入数据。. W! M* _ z6 o# Z% j6 H( U
4 }/ U" V7 x& A5 j F1 z* y无论怎样,truncate表都是高危操作,特别是在生产环境要更加小心,下面列出几点注意事项,希望大家使用时可以做下参考。
4 c6 `9 E7 e0 `2 r! @6 v5 L% ~8 v/ x0 d1 l% b$ r$ f% X, O. L4 D1 U
truncate无法通过binlog回滚。
( \8 w6 N3 ~9 u( F5 D$ etruncate会清空所有数据且执行速度很快。
6 }4 v+ S3 S: ?; Struncate不能对有外键约束引用的表使用。7 |/ C; C" B1 [9 P
执行truncate需要drop权限,不建议给账号drop权限。
! r( Y* Y( W7 L执行truncate前一定要再三检查确认,最好提前备份下表数据。 |
|