文档地址:http://dev.mysql.com/doc/refman/5.6/en/truncate-table.html
个人说明:在学校里考过三次CET4最高一次考了388可见翻译水平有限噢仅供参考
翻译目的:自己的另一篇博文准备引用
13.1.33 TRUNCATE TABLE Syntax
TRUNCATE [TABLE] tbl_name
TRUNCATE TABLE完全清空一张表,该操作需要用户具有删除表的权限(DROP privilege)。
逻辑上来说,TRUNCATE TABLE相较DELETE语句有相似之处,即清空所有的表记录,然后它会再执行包括删除表和重建表在内的一系列恢复表结构的语句。物理上,为了提高性能,它规避了DELETE语句以DML清除数据的方式。因此,一方面TRUNCATE操作不能被回滚,它不会触发DELETE触发器;另一方面它不能用于操作有外键关系的InnoDB父子表。
虽然TRUNCATE TABLE与DELETE语法作用相似,但与DML语句的DELETE不同,它被列为DDL语句。在MySQL5.6里,它与DELETE语法在以下方面存在不同之处:
lTRUNCATE操作是删除表然后重建表,这比DELETE一行一行地清除数据更快,尤其对于一张大表。
lTRUNCATE操作产生一个隐式提交,因此不能回滚。
l如果会话显式锁表TRUNCATE操作不能运行。
l如果TRUNCATE操作的表是InnoDB表或者NDB表,而该表与其他若干有外键约束关系的表相关联,则操作失败。外键约束关系建立在同一张表的字段之间除外。
lTRUNCATE操作不能返回一个有意义的清除了多少行记录的数值。返回的结果通常是“受影响的行 0”,这可以理解为“没有返回信息”。
l只要表定义文件tbl_name.frm是有效的,即便数据和索引文件被损坏,TRUNCATE操作依然可以重建(空)表。
l自增长的字段被重新设置为初始值。这甚至对通常不再重新使用序列值的MyISAM和InnoDB表都有效。
l当用于分区表时,TRUNCATE操作会维持分区,即数据索引文件被删除和重建而分区定义文件(.par)不受影响。
lTRUNCATE操作不会触发DELETE触发器。
对一张表执行TRUNCATE操作会关闭所有被“HANDLER OPEN”打开的handler。
TRUNCATE操作通过先删除表然后紧接着创建表,即作为DDL而不是DML的方式,被用来处理二进制日志以实现(主从)复制的目的。这是基于当使用InnoDB或者其他事务型存储引擎,而事务隔离级别(未提交读或提交读)不支持基于语句的日志模式,在语句或者混合日志模式下这些语句就不能被写进日志以及进行(主从)复制。(Bug #36763)而且,先前所述同样适用于使用InnoDB的复制从服务器。
在一个设定了比较大的InnoDB缓存池以及启用了InnoDB自适应哈希索引的系统上,由于“近期最少使用”内存管理算法的扫描,TRUNCATE操作可能导致系统系能短暂下降,这出现在移除InnoDB表自适应哈希索引记录的时候。这个问题在MySQL5.5.23版本“DROP TABLE”部分已经被提出(Bug #13704145, Bug #64284),而且仍然是TRUNCATE操作的一个已知的问题(Bug #68184)。
TRUNCATE操作可以被用于“Performance Schema”系统库里的汇总表,但效果是重置表中的概要字段为0或者NULL,而不是清空记录。详见章节22.9.9,“Performance Schema Summary Tables”。