我有一张这样的桌子:
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,不知道如何最好地调试它。