web-dev-qa-db-ja.com

偽の外部キー制約が失敗する

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

40行目のエラー1217(23000):親行を削除または更新できません:外部キー制約が失敗します

...テーブルを削除しようとすると:

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コマンドを実行することもできます:-?)

110

2つの可能性:

  1. FK参照を持つ別のスキーマ(mysql用語では「データベース」)内にテーブルがあります
  2. Innodb内部データディクショナリは、mysqlのディクショナリと同期していません。

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

後者の場合は、可能であればサーバー全体をダンプして復元します。

MySQL 5.1以降では、エラーメッセージにFKを含むテーブルの名前が表示されます。

101
MarkR

オンデマンドで、今答えとして...

MySQL Query BrowserまたはphpMyAdminを使用している場合、各クエリに対して新しい接続が開かれているようです( bugs.mysql.com/bug.php?id=828 )。すべてのドロップを書き込む必要があります。 1つのクエリ内のステートメント。

SET FOREIGN_KEY_CHECKS=0; 
DROP TABLE my_first_table_to_drop; 
DROP TABLE my_second_table_to_drop; 
SET FOREIGN_KEY_CHECKS=1; 

SET FOREIGN_KEY_CHECKS=1は追加のセキュリティ対策として機能します...

121
Karlis Rode

外部キーチェックを無効にする

SET FOREIGN_KEY_CHECKS=0
47
Flakron Bytyqi

from このブログ

外部キーチェックを一時的に無効にできます。

SET FOREIGN_KEY_CHECKS=0;

ごちゃごちゃになったら、必ず復元してください:

SET FOREIGN_KEY_CHECKS=1;
28
JackD

うまくいけば、その仕事

SET foreign_key_checks = 0; DROP TABLE table name; SET foreign_key_checks = 1;

6
M_ Fa

Railsでは、Rails consoleを使用して次のことができます。

connection = ActiveRecord::Base.connection
connection.execute("SET FOREIGN_KEY_CHECKS=0;")
1
yeyo

簡単な解決策を見つけて、データベースをエクスポートし、編集したいものをテキストエディターで編集してからインポートします。完了

0
Abdulrahman K

以前にこのテーブルで作業しているときにエラーを受け取った可能性があります。テーブルの名前を変更して、もう一度削除してみてください。

ALTER TABLE `area` RENAME TO `area2`;
DROP TABLE IF EXISTS `area2`;
0