您的位置:首页 > 数据库 > MySQL

MySQL清空数据表的方法实例与分析

2016-10-04 14:05 417 查看

MySQL数据库中,如果我们想清空数据表(删除数据表中所有内容)的话,可以通过下面两个语句来实现:

truncatetable table_n;
deletefrom table_n;

实例

我们先通过实例看下通过这两种方式清空数据库的过程和结果

#delete演示
mysql> create table testforde(
-> number int not null auto_increment,
-> name varchar(20) not null,
-> primary key(number)
-> );
Query OK, 0 rows affected (0.05 sec)
#truncate演示
mysql> create table testfortr(
-> number int not null auto_increment,
-> name varchar(20) not null,
-> primary key(number)
-> );
Query OK, 0 rows affected (0.04 sec)

以上是两张同样结构的数据表,下面我们先插入数据,然后再分别用

delete
truncate
操作它们,看下结果如何

mysql> insert into testforde(name) values('zhagnsan'),('lisi'),('wanger'),('zhaoliu'),('xiaosan'),('qiqi'),('hanba');
Query OK, 7 rows affected (0.04 sec)
Records: 7 Duplicates: 0 Warnings: 0
mysql> insert into testfortr(name) values('zhagnsan'),('lisi'),('wanger'),('zhaoliu'),('xiaosan'),('qiqi'),('hanba');
Query OK, 7 rows affected (0.00 sec)
Records: 7 Duplicates: 0 Warnings: 0
mysql> select * from testforde;
+--------+----------+
| number | name  |
+--------+----------+
|  1 | zhagnsan |
|  2 | lisi  |
|  3 | wanger |
|  4 | zhaoliu |
|  5 | xiaosan |
|  6 | qiqi  |
|  7 | hanba |
+--------+----------+
7 rows in set (0.01 sec)
mysql> select * from testfortr;
+--------+----------+
| number | name  |
+--------+----------+
|  1 | zhagnsan |
|  2 | lisi  |
|  3 | wanger |
|  4 | zhaoliu |
|  5 | xiaosan |
|  6 | qiqi  |
|  7 | hanba |
+--------+----------+
7 rows in set (0.00 sec)
mysql> deletefrom testforde;
Query OK, 7 rows affected (0.02 sec)
mysql> truncatetable testfortr;
Query OK, 0 rows affected (0.02 sec)
mysql> insert into testforde(name) values('zhagnsan'),('lisi'),('wanger'),('zhaoliu'),('xiaosan'),('qiqi'),('hanba');
Query OK, 7 rows affected (0.00 sec)
Records: 7 Duplicates: 0 Warnings: 0
mysql> insert into testfortr(name) values('zhagnsan'),('lisi'),('wanger'),('zhaoliu'),('xiaosan'),('qiqi'),('hanba');
Query OK, 7 rows affected (0.00 sec)
Records: 7 Duplicates: 0 Warnings: 0
mysql> select * from testforde;
+--------+----------+
| number | name  |
+--------+----------+
|  8 | zhagnsan |
|  9 | lisi  |
|  10 | wanger |
|  11 | zhaoliu |
|  12 | xiaosan |
|  13 | qiqi  |
|  14 | hanba |
+--------+----------+
7 rows in set (0.00 sec)
mysql> select * from testfortr;
+--------+----------+
| number | name  |
+--------+----------+
|  1 | zhagnsan |
|  2 | lisi  |
|  3 | wanger |
|  4 | zhaoliu |
|  5 | xiaosan |
|  6 | qiqi  |
|  7 | hanba |
+--------+----------+
7 rows in set (0.00 sec)

从上面操作过程和结果不难看出,它们最大的区别就是

delete
在不限定
where
条件下清空表的话,不会重置
auto_increment
的值,新插入的会随着上次的值接着增加;而
truncate
则不然,他会直接重置为1(其实这里它做的操作可以理解为直接删除表结构和内容,然后按照表结构重建表)

那么除了上面能明显看出来的区别之外,他们还存在以下几点区别:

    1、

truncate
是整个清空的,而delete是逐行删除的。相较而言,
truncate
效率较高。

    2、在事物处理方面,

truncate
可能不会那么安全。因为
delete
语句是数据库操作语言(dml),这个操作会放到
rollback segement
中,事务提交之后才生效;如果有相应的
trigger
,执行的时候将被触发。而
truncate
是数据库定义语言(ddl),操作立即生效,原数据不放到
rollback segment
中,不能回滚,操作不触发
trigger

    3、

truncate
只能做清空表使用,而
delete
可以配合
where
,
order by
,
limit
等字句使用,所以在灵活方面,
delete
完胜。

    4、

truncate
操作不会记录到日志中,而
delete
则是记录的。

    5、正是由于

truncate
操作不会记录到日志中,所以它不会激活触发器。所以对于由
foreign
约束引用的表,不能使用
truncatetable
,而应使用不带
where
子句的
delete
语句。

    6、

truncate
不能用于参与了索引视图的表

总结

以上就是MySQL清空数据表的全部内容了,希望这篇文章的内容对大家的学习或者工作能有所帮助,如果有疑问大家可以留言交流。

您可能感兴趣的文章:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mysql 清空 数据表