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 列として保持しますが、参照するテーブルは完全に削除します)。

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)

テーブル Words を探すと、消えてしまいました。行った。どこに行くかわからない。おそらく、MySQL の内部のテーブル変更コードが一時テーブルを作成しており、それを適切な名前/場所に戻すことができていません。

ここで何が起こっているのですか?外部キーを削除するとテーブル全体が失われる可能性はありますか? 私の経歴は Postgres にあり、これをデバッグする最善の方法がわかりません。

4

1 に答える 1

0

OK、同じ問題を抱えている時点でこれを見つけた人のために、これが起こっていたと私が思うことです:

上記の FK を削除しようとする前に、名前が変更されたテーブルを参照する別の外部キー (上には表示されていません) がテーブルにありました。そのFKの存在が、ALTER TABLE 呼び出しでエラーを引き起こした原因だと思います。

MySQL は基本的に、ALTER TABLE 呼び出し中にテーブル スキーマを再構築します。増分変更は行いません。その結果、テーブル スキーマに他の問題がある場合は、テーブルがランダムに失われている場合は、それらを特定して修正するようにしてください。

ああ、MySQL はこれをもっとうまく扱えるはずです。我が神よ。

于 2013-07-25T21:29:18.217 に答える