0

我有一张这样的桌子:

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)

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

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

4

1 回答 1

0

好的,所以对于在某个时候发现同样问题的任何人,这就是我认为正在发生的事情:

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

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

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

于 2013-07-25T21:29:18.217 回答