我正在搜索为什么TRUNCATE放在DDL而不是DML中的主题,我在这里找到了以下答案 Why is truncate DDL?
在这个答案中我找到了一个句子,如下所示
" TRUNCATE没有运行ON DELETE触发器的事实也使它与正常的DML操作区别开来"
"如果FOREIGN KEY约束指定DELETE CASCADE,则删除子(引用)表中的行,并且截断的表变为空。"
我处于困惑状态。请详细说明这个问题。
谢谢
答案 0 :(得分:0)
MySQL 5.0
...
对于版本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
...
如果有任何引用该表的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
...
- 如果有InnoDB表或NDB表,则TRUNCATE TABLE失败 来自引用该表的其他表的FOREIGN KEY约束。 同一个表的列之间的外键约束是 允许的。
...