tre*_*der 5 mysql truncate constraints phpmyadmin sql-delete
我是一个非常初衷的关系,所以这可能听起来很愚蠢.但是,在截断表和删除所有记录之间(在MySQL中)有什么区别(这个答案仅说明性能)?
我正在玩(在phpMyAdmin中)我的一个测试表,要检查,如何重置auto_increment表的值并运行到情境,我能够删除所有记录:
DELETE from managers;
Run Code Online (Sandbox Code Playgroud)
但是当我试图截断这个表(TRUNCATE managers)时,我得到了警告:Cannot truncate a table referenced in a foreign key constraint (probes, CONSTRAINT probes_ibfk_4 FOREIGN KEY (manager_id) REFERENCES managers (id));.
我必须用"重置" auto_increment值ALTER TABLE managers AUTO_INCREMENT = 1;.
这不奇怪吗?到目前为止,我想,那TRUNCATE= DELETE from managers(在检查和效果方面,因为性能可能不同,但这不是关键).
如何弹出约束警告TRUNCATE而不是"全部删除"?
truncate删除所有行后重置auto_increment.所以它与使用DELETE命令删除所有行不同.
来自mysql参考:
TRUNCATE TABLE完全清空表.从逻辑上讲,这相当于删除所有行的DELETE语句,但在某些情况下存在实际差异.
对于版本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语句将逐个删除行,并在遇到子项引用的父行时停止,从而返回此错误:
错误1451(23000):无法删除或更新父行:外键约束失败(
test.child,CONSTRAINTchild_ibfk_1FOREIGN KEY(parent_id)REFERENCESparent(id))
| 归档时间: |
|
| 查看次数: |
3435 次 |
| 最近记录: |