【问题标题】:Can't truncate MySQL table, while being able to delete all the records无法截断 MySQL 表,同时能够删除所有记录
【发布时间】:2014-05-15 09:40:12
【问题描述】:

我是关系的初学者,所以这听起来很愚蠢。但是,截断表和删除所有记录之间(在 MySQL 中)有什么区别(this 答案仅涉及性能)?

我正在(在 phpMyAdmin 中)使用我的一张测试表进行检查,如何重置表的 auto_increment 值并遇到可以删除所有记录的情况:

DELETE from managers;

但是当我尝试截断此表 (TRUNCATE managers) 时,我收到了警告:Cannot truncate a table referenced in a foreign key constraint (probes, CONSTRAINT probes_ibfk_4 FOREIGN KEY (manager_id) REFERENCES managers (id));

我不得不用ALTER TABLE managers AUTO_INCREMENT = 1;“重置”auto_increment 的值。

这不是很奇怪吗?到目前为止,我一直认为TRUNCATE = DELETE from managers(在检查和效果方面,因为性能可能不同,但这不是关键)。

如何在TRUNCATE 上弹出约束警告而不是在“全部删除”上弹出?

【问题讨论】:

  • stackoverflow.com/questions/5452760/… 也许?您的表通过外键引用自身...
  • 你在哪里看到,我的表引用了它自己?在数据库模式或约束键中都没有这样的引用。我一定是错过了什么。
  • FOREIGN KEY (manager_id) references managers (id)
  • FOREIGN KEY (manager_id) 引用 managers 表(id 列),但此(manager_id 列)是 不同 表中的列。因此,它不引用自身。 MySQL (phpMyAdmin) 错误信息可能有点误导。

标签: mysql phpmyadmin constraints sql-delete truncate


【解决方案1】:

truncate 在删除所有行后重置 auto_increment。所以它与使用 DELETE 命令删除所有行不同。

来自mysql reference

虽然 TRUNCATE TABLE 与 DELETE 类似,但它被归类为 DDL 语句而不是 DML 语句。它与 DELETE 的不同之处在于 有以下几种方式:

截断操作删除并重新创建表,这要快得多 而不是逐行删除,尤其是对于大型表。

截断操作会导致隐式提交,因此无法滚动 背部。请参阅第 13.3.3 节,“导致隐式提交的语句”。

如果会话持有一个 活动表锁。

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

截断操作不会为数字返回有意义的值 已删除的行数。通常的结果是“0 行受影响”,这应该 被解释为“没有信息”。

只要表格格式文件tbl_name.frm有效,表格就可以 使用 TRUNCATE TABLE 重新创建为空表,即使数据 或索引文件已损坏。

任何 AUTO_INCREMENT 值都会重置为其起始值。这是真实的 即使对于 MyISAM 和 InnoDB,它们通常不重用序列 价值观。

与分区表一起使用时,TRUNCATE TABLE 保留 分区;也就是说,数据和索引文件被删除并且 重新创建,而分区定义 (.par) 文件不受影响。

TRUNCATE TABLE 语句不调用 ON DELETE 触发器。

【讨论】:

  • 我已经设法将auto_increment 重置为ALTER TABLE managers AUTO_INCREMENT = 1;,因此您的直接回答可能会产生误导(事实上,TRUNCATE 重置auto_increment 与我所做的相同) )。但是,您引用的文字确实给了我一个想法,发生了什么,所以我接受您的回答。谢谢。
  • 链接死了。它指向一个重定向到 MySQL 8.0 的页面,并且没有对 MySQL 5.0.3 的引用(其行为方式与提供的答案状态完全不同)。
  • 修复了链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-26
  • 2014-12-07
  • 1970-01-01
相关资源
最近更新 更多