开发者学堂课程【MySQL 实操课程:MySQL 务下 truncate 和 delete 的差异】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/717/detail/12815
MySQL 事务下 truncate 和 delete 的差异
目录:
一、truncate 和 delete 的差异
二、MySQL 事务下 delete 操作
三、MySQL 事务下 truncate 操作
四、演示实例
一、truncate 和 delete 的差异
truncate 和 delete 有两个差异:
1、对于表里含有指针 ID 的组件,truncate 操作会把整个表以及指针都清除。当往表里重新写入数据的时候,指针ID又从1开始。而 delete 即使是删除了表,但是指针还在。
2、delete 支持回滚,truncate 不支持回滚。
二、MySQL 事务下 delete 操作
1、MySQL 数据库在开启事务后,执行 delete 操作时,是可以进行回滚的。
2、演示示例
select * from user_bak;
begin;
delete from user_bak;
select * from user_bak;
rollback;
select * from user_bak;
三、MySQL 事务下 truncate 操作
①MySQL 数据库在开启事务后,执行 truncate 操作时,是不可以进行回滚的。
②演示示例
select * from user_bak;
begin;
truncate table user_bak;
select* from user_bak;
rollback;
select * from user_bak;
四、演示实例
1、在 Cloud Shell 页面编辑,创建一个表
mysql> use aliyun;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> create table user_bak as select * from user;
//这种方式可以复制表的结构和数据。回车,看到报错:
ERROR 1786 (HY000) : statement violates GTID consi stency: CREATE TABLE ...SELECT.
提示 MySQL 5.6以上的版本默认开启了 enforce gtid consistency- true 的选项,设置为 true,实际上是为了保障事务的安全,并且能被日志记录到 SQL 语句执行。这样的语句是不允许执行的。可以将其关闭就不影响运行了。
为了不影响系统配置,使用另一种方式建表:
mysql> create table user_bak like user;
//创建表结构
Query OK,0 rows affected (0.01 sec)
mysq1> show tables;
//回车后看到表中没有数据
6 rows in set (0.00 sec)
2、看到已经有 user_bak,但备份表里没有数据。写入数据:
mysq1> select * from user_bak;
Empty set (0.00 sec)
mysq1> insert into user_bak select * from user;
//写入数据
Query OK,4 rows affected (0.01 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysq1> select * from user_bak;
//回车看表里已经有数据内容
4 rows in set (0.00 sec)
3、使用 user_bak 表做实验,演示 delete 操作
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> delete from user_bak;
//delete 操作删除 user_bak
Query OK, 4 rows affected (0.00 sec)
//查询到表内容被删掉
mysq1> select * from user_bak;
Empty set (0.00 sec)
mysql> rollback;
//回滚
Query OK, 0 rows affected (0.00 sec)
mysq1> select * from user_bak;
//回滚查询数据还在
4 rows in set (0.00 sec)
4、演示 truncate 操作
mysql> begin;
Query OK,0 rows affected (0.00 sec)
mysql> truncate table user_bak;
//truncate 操作删除 user_bak
Query OK, 0 rows affected (0.01 sec)
mysq1> select * from user_bak;
//没有内容
Empty set (0.00 sec)
mysq1> rollback;
//回滚
Query OK,0 rows affected (0.00 sec)
mysql> select * from user_bak;
//查询也没有内容
Empty set (0.00 sec)
mysql>
这就是 delete 操作可以回滚,truncate 操作不能回滚。