首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"TRUNCATE不会在DELETE触发器上运行“true或false”

"TRUNCATE不会在DELETE触发器上运行“true或false”
EN

Database Administration用户
提问于 2016-02-10 13:42:49
回答 1查看 3.6K关注 0票数 5

我正在搜索为什么把截断放在DDL而不是DML的主题,我在这里找到了以下答案:为什么截断DDL?

我找到了一个句子,如下所示

“DELETE触发器不运行TRUNCATE也使其与正常的DML操作不同”

这与MYSQL参考手册的说法相冲突。

“如果外键约束指定DELETE级联,则删除子表(引用)表中的行,截断的表变为空。”

我处于一种混乱的状态。请详细说明这个问题。

谢谢

EN

回答 1

Database Administration用户

发布于 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))

但对于5.5及更高版本,文件说:

从逻辑上讲,TRUNCATE TABLE类似于删除所有行的DELETE语句,或DROP TABLECREATE TABLE语句序列。为了达到高性能,它绕过了删除数据的DML方法。因此,它不能回滚,它不会引发ON DELETE触发器,并且不能对具有父-子外键关系的InnoDB表执行。尽管TRUNCATE TABLE类似于DELETE,但它被归类为DDL语句而不是DML语句。它与DELETE在MySQL 5.5中有以下不同之处:.

票数 4
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/128843

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档