TRUNCATE没有运行ON DELETE触发器?

时间:2016-02-09 15:19:40

标签: mysql triggers ddl truncate

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

在这个答案中我找到了一个句子,如下所示

" TRUNCATE没有运行ON DELETE触发器的事实也使它与正常的DML操作区别开来"

这与MYSQL Reference Manual相冲突

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

我处于困惑状态。请详细说明这个问题。

谢谢

1 个答案:

答案 0 :(得分:0)

MySQL 5.0

  

13.1.21 TRUNCATE TABLE Syntax

     

...

     

对于版本5.0.3之前的InnoDB表,InnoDB处理TRUNCATE   通过逐个删除行来表。从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,   在进行时处理约束。如果是FOREIGN KEY   constraint指定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约束。   同一个表的列之间的外键约束是   允许的。
  •   
     

...