1. ホーム
  2. mysql

[解決済み] 外部キー制約の失敗

2022-09-28 02:12:33

質問

このエラーメッセージが表示されます。

ERROR 1217 (23000) at line 40: できません 親行を削除または更新できません。 外部キー制約に失敗しました。

... テーブルを削除しようとしたとき。

DROP TABLE IF EXISTS `area`;

... このように定義されています。

CREATE TABLE `area` (
  `area_id` char(3) COLLATE utf8_spanish_ci NOT NULL,
  `nombre_area` varchar(30) COLLATE utf8_spanish_ci NOT NULL,
  `descripcion_area` varchar(100) COLLATE utf8_spanish_ci NOT NULL,
  PRIMARY KEY (`area_id`),
  UNIQUE KEY `nombre_area_UNIQUE` (`nombre_area`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;

面白いのは 私はすでに他のすべてのテーブルを削除しました に対する外部キーを持っている他の全てのテーブルを削除しました。 area . 実際には、データベースは area テーブル以外は空っぽです。

データベース内に他のオブジェクトがない場合、どのようにして子行ができるのでしょうか?私の知る限り、InnoDBは他のスキーマに対する外部キーを許可していませんよね?

(私は RENAME TABLE area TO something_else コマンドを実行することもできます :-?)

どのように解決するのですか?

2つの可能性があります。

  1. 別のスキーマ (mysql の用語では "database") 内に、FK の参照を持つテーブルがある。
  2. innodb の内部データ辞書は mysql のものと同期していません。

ドロップが失敗した後に "SHOW ENGINE INNODB STATUS" を実行すると、それがどのテーブルであったか(とにかくそのうちの 1 つ)確認することができます。

後者のケースであることが判明した場合、可能であればサーバー全体をダンプしてリストアします。

MySQL5.1以上では、エラーメッセージにFKのあるテーブルの名前が表示されます。