mysql - 删除 MySQL 外键失败导致表丢失

标签 mysql foreign-keys data-loss

我有一个像这样的表:

CREATE TABLE `Words` (
  `wordId` int(11) NOT NULL AUTO_INCREMENT,
     ... snip! ...
  `PartOfSpeechpartOfSpeechId` int(11) DEFAULT NULL,
  PRIMARY KEY (`wordId`) USING BTREE,
  KEY `fk_Words_PartOfSpeech` (`PartOfSpeechpartOfSpeechId`),
  CONSTRAINT `fk_Words_PartOfSpeech` FOREIGN KEY (`PartOfSpeechpartOfSpeechId`) REFERENCES `PartOfSpeech` (`partOfSpeechId`) ON DELETE SET NULL ON UPDATE NO ACTION,
) ENGINE=InnoDB AUTO_INCREMENT=7306 DEFAULT CHARSET=utf8

我需要将 PartOfSpeechpartOfSpeechId 列转换为枚举值(即将其保留为 INT 列,但完全删除它引用的表)。

由于 Words 上的 FK,尝试删除 PartOfSpeech 表会失败。为了解决这个问题,我运行了 ALTER TABLE Words DROP FOREIGN KEY fk_Words_PartOfSpeech ,使用 FK 的名称而不是到处注明的列。我仍然收到错误:

ERROR 1025 (HY000): Error on rename of './lexercise/#sql-1a5_263' to './lexercise/Words' (errno: 150)

在寻找表词时,它已经消失了。走了。不知道去哪里。据推测,MySQL 的内部更改表代码正在创建临时表,但无法将其返回到正确的名称/位置。

这是怎么回事?删除外键怎么可能丢失整个表?我的背景是 Postgres,不知道如何最好地调试它。

最佳答案

好的,对于任何在某个时候发现同样问题的人来说,我认为发生的情况如下:

表上有另一个外键(上面未显示),它引用了在尝试删除上面的 FK 之前已重命名的表。我认为 that FK 的存在是导致我的 ALTER TABLE 调用出现错误的原因。

MySQL 基本上在 ALTER TABLE 调用期间重建表模式 - 它不会进行增量更改。因此,如果表架构存在其他问题,请确保识别它们并修复它们(如果您随机丢失表)。

哦,MySQL 真的应该更好地处理这个问题。天啊。

关于mysql - 删除 MySQL 外键失败导致表丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17867444/

相关文章:

c - 关闭文件描述符时如何防止数据丢失?

c# - Socket Send方法...用一个方法发送大量数据可以吗?

mysql - 设置MySQL保留所有表的update_time

sql - MySQL - 哪里 - 搜索字符串 - 匹配

php - PHP 中的 SQL 数组值

MySQL无法创建带外键的表

database - 甲骨文 (ORA-02270) : no matching unique or primary key for this column-list error

mysql - 我的一张 table 突然消失了,我该如何追踪?

mysql - 导入phpmyadmin错误

c# - 删除级联的 Entity Framework