MySQL 清空表 和截断表

在区分截断表和清空表之前,再简略复习一下SQL语言分类:

1、DQL(数据查询语言):查询语句,凡是 select语句 都是DQL。
2、DML(数据操作语言):insert 、delete 、update 、merge,对 表数据 进行插入、更新、删除、合并。
3、DDL(数据定义语言):create 、drop 、alter 、trunccate,对 表结构 进行创建、删除、更改、截断。
4、TCL(事务控制语言):commit 提交事务, rollback 回滚事务, savepoint 保存点。(TCL中的T是Transaction)
5、DCL(数据控制语言):grant 授权、 revoke 撤销权限等。

清空表和截断表:

清空表: delete from actor;

清空表只是清空表中的逻辑数据,但是物理数据不清楚,如主键值、索引等不被清楚,还是原来的值。

例如:

mysql > create table actor
(
    id int primary key auto_increment,
	name varchar(30) not null,
    country varchar(30) default '中国'
);
+---------+-------------+------+-----+---------+----------------+
| Field   | Type        | Null | Key | Default | Extra          |
+---------+-------------+------+-----+---------+----------------+
| id      | int(11)     | NO   | PRI | NULL    | auto_increment |
| name    | varchar(30) | NO   |     | NULL    |                |
| country | varchar(30) | YES  |     | 中国    |                |
+---------+-------------+------+-----+---------+----------------+
insert into actor(name) values ('于谦');
insert into actor(name) values ('岳云鹏');
insert into actor(name) values ('孙越');
+----+-----------+---------+
| id | name      | country |
+----+-----------+---------+
|  1 | 于谦      | 中国    |
|  2 | 岳云鹏    | 中国    |
|  3 | 孙越      | 中国    |
+----+-----------+---------+

如果我们添加一个指定的数据(新id号 大于原有 id号),则此时再使用 主键id 进行自增操作,主键id 将会从最大的 新id号开始向后自增。

insert into actor(id, name) values (6, '郭德纲');
insert into actor(name) values ('郭麒麟');
+----+-----------+---------+
| id | name      | country |
+----+-----------+---------+
|  1 | 于谦      | 中国    |
|  2 | 岳云鹏    | 中国    |
|  3 | 孙越      | 中国    |
|  6 | 郭德纲    | 中国    |
|  7 | 郭麒麟    | 中国    |
+----+-----------+---------+
delete from actor where id >= 6;
+----+-----------+---------+
| id | name      | country |
+----+-----------+---------+
|  1 | 于谦      | 中国    |
|  2 | 岳云鹏    | 中国    |
|  3 | 孙越      | 中国    |
+----+-----------+---------+

此时,如果仍保持 主键id 自增添加数据,则会发现数据仍从被delete 删除的 最大id处继续增加。

insert into actor(name) values ('张云雷');
+----+-----------+---------+
| id | name      | country |
+----+-----------+---------+
|  1 | 于谦      | 中国    |
|  2 | 岳云鹏    | 中国    |
|  3 | 孙越      | 中国    |
|  8 | 张云雷    | 中国    |
+----+-----------+---------+

截断表: truncate table actor;
截断表同样可以用于删除 表中的数据,但不同的是 truncate只能 整表中的删除所有数据,不能使用 where子句进行条件删除。

例如:

truncate table actor where id >= 3;
mysql> truncate table actor where id > 3;
ERROR 1064 (42000):
truncate table actor;

select * from actor;
mysql> truncate table actor;
Query OK, 0 rows affected (0.11 sec)

mysql> select * from actor;
Empty set (0.00 sec)

对表进行 truncate 截断操作之后,继续对该表添加数据,就会发现 原本的自增主键id,此时被进行了初始化,主键id继续从1开始自增。

insert into actor(name) values ('栾云平');
+----+-----------+---------+
| id | name      | country |
+----+-----------+---------+
|  1 | 栾云平    | 中国    |
+----+-----------+---------+

总结

清空表 截断表
DELETE 是DML命令 TRUNCATE 是DDL命令
可以使用 Where子句 无法使用 Where条件
比截断慢,因为它保留日志 在性能上更快,因为它不保留任何日志
删除激活触发器,因为该操作是单独记录的 TRUNCATE TABLE 无法激活触发器,因为该操作不会记录单个行的删除
指定过滤器,如果存在条件,它将删除指定的数据 删除所有重置自动递增编号的数据
DELETE语句 使用行锁执行,表中的每一行都被锁定以删除 TRUNCATE TABLE 始终锁定表和页面,但不锁定每一行
可以回滚 可以回滚
LIMIT子句还可用于设置要删除的行数的限制; 无法使用LIMIT
ORDER BY子句 可以在 DELETE语句中使用。在这种情况下,将按指定顺序删除行 无法使用ORDER BY

如有错误之处,欢迎评论指出~~~
期待和您共同进步~~~

おすすめ

転載: blog.csdn.net/weixin_42428778/article/details/110448878