发布于 2016-02-10 14:10:09
您的第一个链接(为什么截断DDL?)是关于甲骨文的,而不是MySQL。虽然相关,但不同的DBMS实现相同的特性不同。在Oracle和Server中,TRUNCATE是DDL,而不是DML。
在MySQL中,使用哪个版本很重要:
从逻辑上讲,
TRUNCATE TABLE等同于删除所有行的DELETE语句,但在某些情况下存在实际差异。对于InnoDB表:
FOREIGN KEY约束,InnoDB执行快速截断,方法是删除原始表并创建一个具有相同定义的空表,这比逐个删除行要快得多。innodb_file_per_table选项的情况下使用这种快速截断技术时,操作系统可以重用已释放的磁盘空间。对于InnoDB插件的用户,空间是自动回收的,如TRUNCATE TABLE回收磁盘空间中所描述的那样。如果没有安装InnoDB插件,则发出OPTIMIZE TABLE语句以释放表的磁盘空间。FOREIGN KEY约束,InnoDB会逐个删除行来处理TRUNCATE TABLE,并在其进行过程中处理这些约束。如果FOREIGN KEY约束指定DELETE CASCADE,则删除子表(引用)表中的行,截断表变为空。如果FOREIGN KEY约束没有指定CASCADE,则TRUNCATE TABLE语句将逐个删除行,并在遇到子行引用的父行时停止,返回此错误:错误1451 (23000):无法删除或更新父行:外键约束失败(test.child,constraint child\_ibfk\_1 foreign key (parent\_id) REFERENCES parent (id))从逻辑上讲,
TRUNCATE TABLE类似于删除所有行的DELETE语句,或DROP TABLE和CREATE TABLE语句序列。为了达到高性能,它绕过了删除数据的DML方法。因此,它不能回滚,它不会引发ON DELETE触发器,并且不能对具有父-子外键关系的InnoDB表执行。尽管TRUNCATE TABLE类似于DELETE,但它被归类为DDL语句而不是DML语句。它与DELETE在MySQL 5.5中有以下不同之处:.
https://dba.stackexchange.com/questions/128843
复制相似问题