Примусовий падіння mysql, минаючи обмеження зовнішнього ключа


134

Я намагаюся видалити всі таблиці з бази даних, крім однієї, і у мене з’являється така помилка:

Неможливо видалити або оновити батьківський рядок: помилка іноземного ключа виходить з ладу

Звичайно, я міг би спробувати і помилитися, щоб побачити, що це за ключові обмеження, і врешті-решт видалити всі таблиці, але я хотів би знати, чи є швидкий спосіб змусити скинути всі таблиці (оскільки я зможу повторно вставити ці не хочу видалено).

Google націлив мене на якийсь сайт, який запропонував такий спосіб:

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

Коротка відповідь: це насправді не зробило хитрощів, оскільки я в кінцевому підсумку отримав ту саму помилку, коли мені вдалося видалити ще кілька таблиць. Я бачив на Stack Overflow способи зв'язати всі зовнішні ключі, пов'язані з певною таблицею, але це занадто багато часу, якщо я все це не скриптую (що можна зробити у випадку, якщо іншого варіанту немає)

База даних 4.1, тому я не можу використовувати DROP DATABASE

Ідеї?


1
Чому ви обрали відповідь як обрану, яка навіть не забезпечує вирішення вашого питання?
Санджай

Відповіді:


-40

Оскільки вам не цікаво зберігати будь-які дані, киньте всю базу даних та створіть нову.


3
О мій, я відчуваю себе таким дурним, що замінив слово DATABASE фактичним іменем бази даних, а не додавати його згодом, дякую обом +1
johnnyArt

13
це не відповідь
фрілансер

8
Весело побачити, що ця відповідь поставила відмітку та оновлення
tom10271

4
@RobertPounder це була саме моя мета, і з моменту приєднання до цього сайту. Я ціную вашу точку зору.
Otávio Décio

3
@RobertPounder SO - це дещо більше, ніж просто допомога ОП, це дорівнює пошуковому ресурсу "як", я приземлився на цю тему, тому що мені потрібно було вимкнути перевірку обмежень іноземних ключів, і Google привів мене сюди. Я щасливий, що скидання бази даних було гарним вирішенням для ОП, але відповідь нижче насправді правильна для запитання "Примусити скинути mysql, минаючи обмеження зовнішнього ключа".
Валь Редченко

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. Ти врятував мені день.
MaNn

працював чудово, я використав це, бо не можу скинути всю базу даних
Пабло Пацос,

1
Я погоджуюся, що це зазвичай правильне рішення, але @johnnyArt, який задав це питання, спеціально виключив це як життєздатний варіант, оскільки він не працював для нього. Тож здається, що це не правильна відповідь на початкове запитання, чи не так?
Давид

18

Якщо ви використовуєте phpmyadmin, ця функція вже є.

  • Виберіть таблиці, які потрібно скинути
  • З випадаючого списку внизу списку таблиць виберіть спад
  • Відкриється нова сторінка, у нижній частині якої встановлено прапорець "Перевірка зовнішнього ключа", зніміть її.
  • Підтвердьте видалення, прийнявши "так".

3
Ти врятував мій день! Дякую! Працював як шарм!
Камі

4

Ви можете скористатись наступними кроками, для мене випала таблиця з обмеженнями, рішення, вже пояснене у коментарі, я просто додав знімок екрана для цього -введіть тут опис зображення


Це дублікат найвищої відповіді, який був опублікований за чотири роки до цього.
чб

3

База даних Drop існує у всіх версіях 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> 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.