Примусовий падіння 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.