【TRUNCATE】使用之MySQL官方文档说明

版权声明:本文为博主原创文章,转载敬请作出引用声明方便相互交流学习! https://blog.csdn.net/sweeper_freedoman/article/details/52553427


文档地址: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 TABLEDELETE语法作用相似,但与DML语句DELETE不同,它列为DDL语句。MySQL5.6DELETE语法以下方面存在不同之处

lTRUNCATE操作删除表然后重建表这比DELETE一行一行地清除数据更快尤其对于一张大表。

lTRUNCATE操作产生一个隐式提交,因此不能回滚。

l如果会话显式锁表TRUNCATE操作不能运行

l如果TRUNCATE操作的表InnoDB表或者NDB表,而该表与其他若干外键约束关系的表相关联,则操作失败。外键约束关系建立在同一张表的字段之间除外

lTRUNCATE操作不能返回一个有意义的清除了多少行记录的数值。返回的结果通常是受影响的行 0”这可以理解为没有返回信息

l只要表定义文件tbl_name.frm有效的,即便数据和索引文件被损坏,TRUNCATE操作依然可以重建(空)表

l自增长的字段重新设置为初始值这甚至对通常不再重新使用序列值MyISAMInnoDB都有效

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”。

阅读更多
换一批

没有更多推荐了,返回首页