web-dev-qa-db-ja.com

外部キー制約をバイパスしてmysqlを強制的にドロップする

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

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

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

Googleは、次の方法を提案するサイトを狙っていました。

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

簡単な答えは、テーブルを削除することができたときに同じエラーを受け取ったため、実際にはトリックを実行しなかったということです。特定のテーブルにリンクされているすべての外部キーを取得するスタックオーバーフローの方法を見てきましたが、すべてをスクリプト化しない限り時間がかかりすぎます(他のオプションがない場合に実行可能です)

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

アイデア?

129
johnnyArt

これは、検索でここにたどり着く人にとって有用かもしれません。 viewではなく、tableをドロップしようとしていることを確認してください。

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

SET foreign_key_checks = 0は外部キーチェックをオフに設定し、SET foreign_key_checks = 1は外部キーチェックをオンに戻すことです。チェックがオフになっている間、テーブルをドロップできますが、テーブル構造の整​​合性を保つためにチェックがオンに戻ります。

367
PAT

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

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

次の手順を使用できますが、制約付きのテーブルを削除するために私のために働いた、解決策は上記のコメントですでに説明されています、私はちょうどそのためのスクリーンショットを追加しました-enter image description here

4
srinivas

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

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

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

次に、mysqlにログインして、

ソースdump.sql;

3
MindStalker

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

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

サーバーバージョンに対応: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> 
0
Sanjay Khadka