基础知识
mysql 中的truncate 和delete 都能够清理表中数据,但是它们有什么区别呢
TRUNCATE | DELETE | |
---|---|---|
条件删除 | 不支持 | 支持 |
事务回滚 | 不支持 | 支持 |
清理速度 | 快 | 慢 |
高水位重置 | 是 | 否 |
问题
在一个事务中使用了truncate 会导致后续的sql 无法回滚。
MariaDB [test_db]> create table tbl4(id int primary key ,num1 int not null);
Query OK, 0 rows affected (0.005 sec)
MariaDB [test_db]> insert into tbl4 values (1,2),(2,3),(4,7);
Query OK, 3 rows affected (0.002 sec)
Records: 3 Duplicates: 0 Warnings: 0
MariaDB [test_db]> begin;
Query OK, 0 rows affected (0.001 sec)
MariaDB [test_db]> truncate tbl4;
Query OK, 0 rows affected (0.005 sec)
MariaDB [test_db]> insert into tbl4 values (1,2),(2,3),(4,7);
Query OK, 3 rows affected (0.002 sec)
Records: 3 Duplicates: 0 Warnings: 0
MariaDB [test_db]> rollback;
Query OK, 0 rows affected (0.001 sec)
MariaDB [test_db]> select * from tbl4;
+----+------+
| id | num1 |
+----+------+
| 1 | 2 |
| 2 | 3 |
| 4 | 7 |
+----+------+
3 rows in set (0.001 sec)
MariaDB [test_db]>
truncate 会删除所有数据,并且不记录日志,不可以恢复数据,相当于保留了表结构,重新建立了一张同样的表。由于数据不可恢复,truncate 之前的操作也不能回滚。
MariaDB [test_db]> begin;
Query OK, 0 rows affected (0.001 sec)
MariaDB [test_db]> update tbl4 set num1=12 where id=1;
Query OK, 1 row affected (0.001 sec)
Rows matched: 1 Changed: 1 Warnings: 0
MariaDB [test_db]> truncate tbl4;
Query OK, 0 rows affected (0.005 sec)
MariaDB [test_db]> rollback;
Query OK, 0 rows affected (0.001 sec)
MariaDB [test_db]> select * from tbl4;
Empty set (0.001 sec)
MariaDB [test_db]>