外部キー制約をバイパスしてMySQLを強制的に削除する


134

1つを除いてデータベースからすべてのテーブルを削除しようとすると、次のエラーが発生します。

親行を削除または更新できません:外部キー制約が失敗します

もちろん、試行錯誤してそれらの主要な制約を確認し、最終的にすべてのテーブルを削除することもできますが、すべてのテーブルを強制的に削除する高速な方法があるかどうかを知りたいです(これらを再挿入できるため、削除したくない)。

グーグルは私に次の方法を提案するいくつかのサイトを狙った:

mysql> SET foreign_key_checks = 0;
mysql> drop table ...
mysql> SET foreign_key_checks = 1;

簡単に言えば、いくつかのテーブルを削除できたときに同じエラーが発生するため、実際にはうまくいきませんでした。すべての外部キーを特定のテーブルにリンクする方法をスタックオーバーフローで確認しましたが、すべてをスクリプト化しない限り、時間がかかりすぎます(他のオプションがない場合に実行可能です)。

データベースが4.1なので使用できません DROP DATABASE

アイデア?


1
なぜあなたはあなたの質問への解決策さえ提供しない選択された答えを選んだのですか?
Sanjay

回答:


-40

データを保持する必要がないので、データベース全体を削除して、新しいデータベースを作成します。


3
ああ、私は今、とても馬鹿げていると感じました。後で追加するのではなく、データベースの実際の名前でDATABASEという単語に置き換えていました。両方のおかげで、+ 1
johnnyArt '20

13
これは答えではありません
フリーランサー、

8
この回答がチェックされ、賛成票を得たのを見るのは陽気です
tom10271

4
@RobertPounderはまさに私の目的であり、私がこのサイトに参加してからずっとそうです。あなたの視点に感謝します。
のOtavioDécio

3
@RobertPounder SOは単にOPを支援するだけではなく、検索可能な「ハウツー」リソースに相当します。外部キー制約チェックを無効にする必要があるため、このトピックにたどりつきました。私はデータベースを削除することがOPの良い回避策であったことを嬉しく思いますが、以下の答えは実際に「強制ドロップMySQLが外部キー制約をバイパスする」という質問に対して正しいです。
Val Redchenko 2017

404

これは、検索からここにたどり着く人にとって役立つかもしれません。ビューではなくテーブルを削除しようとしていることを確認してください。

SET foreign_key_checks = 0;
-ドロップテーブル
ドロップテーブル...
-ドロップビュー
ドロップビュー...
SET foreign_key_checks = 1;

SET foreign_key_checks = 0外部キーチェックをオフSET foreign_key_checks = 1に設定してから、外部キーチェックをオンに戻すことです。チェックがオフになっている間はテーブルを削除できますが、チェックはオンに戻されて、テーブル構造の整​​合性が維持されます。


43
PATは私の友達です!
SeanDowney

5
これはより良い正解です。すべてのテーブルを削除する場合でも、いくつか削除する場合でも、問題を解決します。すごい!
ルークスティーブンソン

@PATどうもありがとうございました。ただし、Mysql Query browserでは機能しませんでした。あなたは私の日を救った。
2015

データベース全体を削除できないため、これを使用しました
Pablo Pazos '27 / 07/27

1
これは通常は正しい解決策であることに同意しますが、質問をした@johnnyArtは、彼にとってうまくいかなかったため、具体的には実行可能なオプションとして除外しました。だから、これは元の質問に対する正しい答えではないようですよね?
デビッド

18

phpmyadminを使用している場合、この機能はすでに存在しています。

  • ドロップするテーブルを選択します
  • テーブルリストの下部にあるドロップダウンから、ドロップを選択します
  • 下部に「外部キーのチェック」と書かれたチェックボックスがある新しいページが開きます。チェックを外します。
  • 「はい」を受け入れて削除を確認します。

3
あなたは私の日を救った!ありがとう!魅力のように働いた!
カミ

4

次の手順を使用できます。制約付きのテーブルを削除するために機能しました。上記のコメントですでに説明されている解決策です。そのスクリーンショットを追加しました-ここに画像の説明を入力してください


これは、4年前に投稿された最高投票数の回答の複製です。
CHB

3

MySQLのすべてのバージョンにドロップデータベースが存在します。しかし、テーブル構造を維持したい場合は、ここにアイデアがあります

mysqldump --no-data --add-drop-database --add-drop-table -hHOSTNAME -uUSERNAME -p> dump.sql

これはプログラムであり、mysqlコマンドではありません

次に、mysqlにログインし、

ソースdump.sql;


1

端末からすべてのテーブルを一度に削除するシンプルなソリューション。

これには、mysqlシェル内のいくつかのステップが含まれていました(ただし、ワンステップソリューションではありません)。

サーバーバージョンで動作:5.6.38 MySQL Community Server(GPL)

私が従った手順:

 1. generate drop query using concat and group_concat.
 2. use database
 3. turn off / disable foreign key constraint check (SET FOREIGN_KEY_CHECKS = 0;), 
 4. copy the query generated from step 1
 5. re enable foreign key constraint check (SET FOREIGN_KEY_CHECKS = 1;)
 6. run show table

MySQLシェル

$ mysql -u root -p
Enter password: ****** (your mysql root password)
mysql> SYSTEM CLEAR;
mysql> SELECT CONCAT('DROP TABLE IF EXISTS `', GROUP_CONCAT(table_name SEPARATOR '`, `'), '`;') AS dropquery FROM information_schema.tables WHERE table_schema = 'emall_duplicate';
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| dropquery                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| DROP TABLE IF EXISTS `admin`, `app`, `app_meta_settings`, `commission`, `commission_history`, `coupon`, `email_templates`, `infopages`, `invoice`, `m_pc_xref`, `member`, `merchant`, `message_templates`, `mnotification`, `mshipping_address`, `notification`, `order`, `orderdetail`, `pattributes`, `pbrand`, `pcategory`, `permissions`, `pfeatures`, `pimage`, `preport`, `product`, `product_review`, `pspecification`, `ptechnical_specification`, `pwishlist`, `role_perms`, `roles`, `settings`, `test`, `testanother`, `user_perms`, `user_roles`, `users`, `wishlist`; |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> USE emall_duplicate;
Database changed
mysql> SET FOREIGN_KEY_CHECKS = 0;                                                                                                                                                   Query OK, 0 rows affected (0.00 sec)

// copy and paste generated query from step 1
mysql> DROP TABLE IF EXISTS `admin`, `app`, `app_meta_settings`, `commission`, `commission_history`, `coupon`, `email_templates`, `infopages`, `invoice`, `m_pc_xref`, `member`, `merchant`, `message_templates`, `mnotification`, `mshipping_address`, `notification`, `order`, `orderdetail`, `pattributes`, `pbrand`, `pcategory`, `permissions`, `pfeatures`, `pimage`, `preport`, `product`, `product_review`, `pspecification`, `ptechnical_specification`, `pwishlist`, `role_perms`, `roles`, `settings`, `test`, `testanother`, `user_perms`, `user_roles`, `users`, `wishlist`;
Query OK, 0 rows affected (0.18 sec)

mysql> SET FOREIGN_KEY_CHECKS = 1;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW tables;
Empty set (0.01 sec)

mysql> 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.