删除MySQL外键失败时丢失表



我有一个这样的表:

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的内部alter表代码正在创建一个临时表,但未能将其返回到正确的名称/位置。

这是怎么回事?丢了一把外键怎么可能丢了一整张桌子?我的背景是Postgres,不知道如何最好地调试它。

好吧,所以对于任何在某个时候发现同样问题的人来说,我认为发生了什么:

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

MySQL基本上在ALTERTABLE调用期间重建表架构,它不进行增量更改。因此,如果表模式有其他问题,请确保识别它们,并在随机丢失表的情况下修复它们。

哦,MySQL真的应该处理得更好。我的天。

最新更新