このエラーメッセージが表示されます。
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
コマンドを実行することもできます:-?)
2つの可能性:
ドロップが失敗した後、「SHOW ENGINE INNODB STATUS」を実行することで、どのテーブルであったか(いずれか1つ)を確認できます。
後者の場合は、可能であればサーバー全体をダンプして復元します。
MySQL 5.1以降では、エラーメッセージにFKを含むテーブルの名前が表示されます。
オンデマンドで、今答えとして...
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
は追加のセキュリティ対策として機能します...
外部キーチェックを無効にする
SET FOREIGN_KEY_CHECKS=0
from このブログ :
外部キーチェックを一時的に無効にできます。
SET FOREIGN_KEY_CHECKS=0;
ごちゃごちゃになったら、必ず復元してください:
SET FOREIGN_KEY_CHECKS=1;
うまくいけば、その仕事
SET foreign_key_checks = 0; DROP TABLE table name
; SET foreign_key_checks = 1;
Railsでは、Rails console
を使用して次のことができます。
connection = ActiveRecord::Base.connection
connection.execute("SET FOREIGN_KEY_CHECKS=0;")
簡単な解決策を見つけて、データベースをエクスポートし、編集したいものをテキストエディターで編集してからインポートします。完了
以前にこのテーブルで作業しているときにエラーを受け取った可能性があります。テーブルの名前を変更して、もう一度削除してみてください。
ALTER TABLE `area` RENAME TO `area2`;
DROP TABLE IF EXISTS `area2`;