在 MySQL数据库中,还有一种方式可以用来删除表中所有的记录,这种方式需要用到一个关键字 TRUNCATE,其语法格式如下:
TEUNCATE [TABLE] 表名
TRUNCATE的语法格式很简单,只需要通过 “ 表名 ” 指定要执行删除操作的表即可。下面通过一个案例来演示 TRUNCEATE 的用法。
例如,在数据库 chapter03 中创建一张表 tab_truncate,创建 tab_truncate 表的SQL 语句如下所示:
mysql> CREATE TABLE tab_truncate(-> Id INT(3) PRIMARY KEY AUTO_INCREMENT,-> name VARCHAR(4)-> );
Query OK, 0 rows affected, 0 warning (0.02 sec)
在创建的 tab_truncate 表中,id 字段值设置了 AUTO_INCREMENT,在每次添加记录时系统会为该字段自动添加值,id 字段的默认初始值是1,每添加一条记录,该字段值会自动加1。接下来向 tab_truncate 表中添加 5 条记录,且只添加 name 字段的值 SQL 语句如下所示:
mysql> INSERT INTO tab_truncate(name)-> VALUES('A'),('B'),('C'),('D'),('E');
Query OK, 5 rows affected (0.01 sec)
Records: 5 Duplicates: 0 Warnings: 0
执行 INSERT 语句向 tab_truncate 表中添加 5 条记录,接下来通过查询语句查看数据是否成功添加,执行结果如下所示:
mysql> select * from tab_truncate;
+----+------+
| Id | name |
+----+------+
| 1 | A |
| 2 | B |
| 3 | C |
| 4 | D |
| 5 | E |
+----+------+
5 rows in set (0.00 sec)
从查询结果可以看出,tab_truncate表中添加了 5 条记录,且系统自动为每条记录的 id 字段添加了值。接下来使用 TRUNCATE 语句删除 tab_truncate 表中的所有记录 TRUNCATE 语句如下所示:
TRUNCATE TABLE tab_truncate;
执行结果如下所示:
mysql> TRUNCATE TABLE tab_truncate;
Query OK, 0 rows affected (0.01 sec)
从执行结果可以看到 TRUNCATE 语句成功执行,接下来通过查询语句查看 tab_truncate 表中的记录是否删除成功,执行语句如下所示:
mysql> select * from tab_truncate;
Empty set (0.00 sec)
通过查询结果可以看到记录为空,说明 tab_truncate 表中的记录被全部删除了。TRUNCATE语句和 DETELE 语句都能实现删除表中的所有数据的功能,但两者也有一定的区别,下面就针对两者的区别进行说明。
(1)DELETE 语句是 DML语句,TRUNCATE语句通常被认为是 DDL 语句。
(2)DELETE语句后面可以跟 WHERE 子句,通过指定 WHERE 子句中的条件表达式只删除满足条件的部分记录,而 TRUNCATE语句只能用于删除表中的所有记录。
(3)使用TRUNCATE语句删除表中的数据后,再次向表中添加记录时,自动增加字段的默认初始值重新由1开始,而使用 DELETE语句删除表中所有记录后,再次向表中添加记录时,自动增加字段的值为删除时该字段的最大值加 1。
例如,在空表 tab_truncate 中,重新添加 5 条记录,SQL语句如下
mysql> INSERT INTO tab_truncate(name)-> VALUES('F'),('G'),('H'),('I'),('J');
Query OK, 5 rows affected (0.01 sec)
Records: 5 Duplicates: 0 Warnings: 0
执行 INSERT 语句向 tab_truncate 表中添加 5 条记录,使用查询语句查看表中的记录,执行结果如下所示:
mysql> select * from tab_truncate;
+----+------+
| Id | name |
+----+------+
| 1 | F |
| 2 | G |
| 3 | H |
| 4 | I |
| 5 | J |
+----+------+
5 rows in set (0.00 sec)
从查询结果可以看出,系统为 tab_truncate 表中 id 字段默认添加了值,初始值从 1 开始。接下来使用 DELETE 语句删除 tab_truncate 表中的所有记录,DELETE语句如下所示:
mysql> DELETE FROM tab_truncate;
Query OK, 5 rows affected (0.00 sec)
执行 DELETE 语句删除 tab_truncate 表中全部记录,然后向表中添加一条新记录 SQL 语句如下所示:
mysql> INSERT INTO tab_truncate(name) VALUES('K');
Query OK, 1 row affected (0.01 sec)
执行 INSERT 语句向 tab truncate表中添加一条记录,再次使用查询语句查看表中的记录,SQL语句如下所示:
mysql> select * from tab_truncate;
+----+------+
| Id | name |
+----+------+
| 6 | K |
+----+------+
1 row in set (0.00 sec)
从查询结果可以看到,新添加记录的 id 字段为 6,这是因为在使用 DELETE 语句删除的 5 条记录中,id 字段的最大值为5,因此再次添加记录时,新记录的 id 字段值就为 5+1。
(4)使用 DELETE 语句时,每删除一条记录都会在日志中记录,而使用TRUNCATE语句时,不会在日志中记录删除的内容,因此TRUNCATE语句的执行效率比 DELETE 语句高。