mysql truncate快速删除表数据
时间:2013-10-12 10:10:36 作者:beebol 标签: CREATE TABLE DELETE DROP TRUNCATE 分类: Mysql
这里以mysql5.5说明,不同版本会有些不同,但不会有太大区别。
TRUNCATE TABLE就是清空数据表,它需要数据库的DROP权限。从逻辑上,它类似DELETE语句删除所有数据表数据。它是通过DROP TABLE和CREATE TABLE语句来实现高效清空数据,原因是它绕过了DML数据删除方法,所以就无法回滚,也无法导致ON DELETE触发器,在Innodb数据表中不能使用亲子外键关系。
TRUNCATE TABLE虽然是类似删除,它仍然被列为是一个DDL语句。它主要如下几点不同于DELETE语句:
1、TRUNCATE TABLE就是DROP表,然后重新CREATE表,所以比一行行删除要快得多,由其是非常大的表;
2、TRUNCATE TABLE的提交方式是无法回滚的;
3、TRUNCATE TABLE在Innodb表执行时,如果和其它表有外键约束,或引用表,就会执行失败。但同一个表内的列约束是可以的。
4、DELETE语句删除会返回影响数据行,但TRUNCATE TABLE不会返回任务信息;
5、只要一个表的表结构文件tbl_name.frm还是好的,利用TRUNCATE TABLE就可以重新创建表,尽管是数据文件和索引文件都坏了;
6、TRUNCATE TABLE数据表之后,AUTO_INCREMENT数据列会重新开始计数,一般DELETE不会。
7、当在分区表中使用TRUNCATE TABLE时,会DROP和重新CREATE数据文件及索引文件,但分区定义文件不受影响;
8、TRUNCATE TABLE不能触发ON DELETE触发器。
如下是操作实例:
mysql> select count(*) from billing_ldj; +----------+ | count(*) | +----------+ | 3251 | +----------+ 1 row in set (0.00 sec) mysql> truncate table billing_ldj; ERROR 1105 (HY000): MyISAM table 'billing_ldj' is in use (most likely by a MERGE table). Try FLUSH TABLES. mysql> flush tables; Query OK, 0 rows affected (0.03 sec) mysql> truncate table billing_ldj; Query OK, 0 rows affected (0.06 sec) mysql> select count(*) from billing_ldj; +----------+ | count(*) | +----------+ | 0 | +----------+1 row in set (0.00 sec) 1 row in set (0.00 sec)