关于删除MySQL外键失败的丢失表

时间:2013-07-25 19:49:16

标签: 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列,但删除它完全引用的表)。

由于Word上的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的内部alter table代码正在创建临时表,并且无法将其返回到正确的名称/位置。

这里发生了什么?如何在丢弃外键时丢失整个表格?我的背景是在Postgres,不知道如何最好地调试它。

1 个答案:

答案 0 :(得分:0)

好的,对于那些在某个时刻发现同样问题的人来说,这就是我认为发生的事情:

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

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

哦,MySQL真的应该更好地处理这个问题。我的上帝。