【问题标题】:TRUNCATE doesn't run ON DELETE trigger?TRUNCATE 不会在 DELETE 触发器上运行?
【发布时间】:2016-05-19 15:36:32
【问题描述】:

我正在搜索为什么将 TRUNCATE 放在 DDL 而不是 DML 中的主题,我在这里找到了以下答案 Why is truncate DDL?

在这个答案中,我找到了下面给出的一句话

“TRUNCATE 不运行 ON DELETE 触发器这一事实也使它与正常的 DML 操作不同”

这与 MYSQL Reference Manual 冲突,它说

“如果 FOREIGN KEY 约束指定 DELETE CASCADE,则子(引用)表中的行将被删除,并且被截断的表变为空。”

我处于迷茫状态。请详细说明这个问题。

谢谢

【问题讨论】:

  • 虽然大多数概念可能很常见,但该链接属于关于 Oracle 的问题。
  • 我认为大多数关于 SQL 的概念对于 MYSQL 和 Oracle SQL 来说都是通用的
  • @geeksal - 触发器是数据库引擎之间可能存在巨大差异的区域。
  • @Damien_The_Unbeliever 如果您可以从一些可靠的来源引用这种处理或不处理触发器的行为是基于数据库引擎的类型,那么我肯定会同意您的看法。给定的文档链接说的是关于 InnoDB,但是它没有提到关于 MISAM 的任何事情或关于数据库引擎问题的任何澄清。如果您得到解决方案,请发布答案。
  • 我更多地是指您认为 Oracle 和 MySQL 相似的假设。

标签: mysql triggers ddl truncate


【解决方案1】:

MySQL 5.0

13.1.21 TRUNCATE TABLE Syntax

...

对于 5.0.3 之前的 InnoDB 表,InnoDB 处理 TRUNCATE TABLE 通过一一删除行。从 MySQL 5.0.3 开始,逐行 仅当存在任何 FOREIGN KEY 约束时才使用删除 参考表格。如果没有 FOREIGN KEY 约束,InnoDB 通过删除原始表并创建快速截断 一个具有相同定义的空,比 逐行删除。 (当使用快速截断时,它会重置任何 AUTO_INCREMENT 计数器归零。从 MySQL 5.0.13 开始, AUTO_INCREMENT 计数器被 TRUNCATE TABLE 重置为零,无论 是否存在外键约束。)

在 FOREIGN KEY 约束引用表的情况下,InnoDB 逐行删除并处理每一行的约束。如果 FOREIGN KEY 约束指定 DELETE CASCADE,行来自 子(引用)表被删除,截断表变为 空的。如果 FOREIGN KEY 约束未指定 CASCADE,则 TRUNCATE TABLE 语句逐一删除行,如果删除则停止 遇到被孩子引用的父行,返回 这个错误:

ERROR 1451 (23000): Cannot delete or update a parent row: a foreign
key constraint fails (`test`.`child`, CONSTRAINT `child_ibfk_1`
FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`))

...

MySQL 5.1

13.1.34 TRUNCATE TABLE Syntax

...

如果有任何引用该表的 FOREIGN KEY 约束, InnoDB 通过一一删除行来处理 TRUNCATE TABLE, 在进行时处理约束。如果外键 约束指定 DELETE CASCADE,来自子级的行(引用) 表被删除,截断的表变为空。如果 FOREIGN KEY 约束没有指定 CASCADE,TRUNCATE TABLE 语句逐行删除,如果遇到父级则停止 子级引用的行,返回此错误:

ERROR 1451 (23000): Cannot delete or update a parent row: a foreign
key constraint fails (`test`.`child`, CONSTRAINT `child_ibfk_1`
FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`))

注意

在 MySQL 5.5 及更高版本中,外键引用的 InnoDB 表不允许使用 TRUNCATE TABLE。为便于升级,请改写此类语句以使用 DELETE。

...

MySQL >= 5.5

13.1.34 TRUNCATE TABLE Syntax

...

  • 如果有任何 InnoDB 表或 NDB 表,TRUNCATE TABLE 将失败 来自引用该表的其他表的 FOREIGN KEY 约束。 同一张表的列之间的外键约束是 允许。

...

【讨论】:

  • 我在问上面两个链接中的哪一个歪曲事实或者我误解了这个概念。
猜你喜欢
  • 1970-01-01
  • 2017-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-29
  • 2019-05-29
相关资源
最近更新 更多