Wymuś usunięcie mysql z pominięciem ograniczenia klucza obcego


134

Próbuję usunąć wszystkie tabele z bazy danych z wyjątkiem jednej i kończy się następującym błędem:

Nie można usunąć ani zaktualizować wiersza nadrzędnego: ograniczenie klucza obcego kończy się niepowodzeniem

Oczywiście mógłbym próbować i popełniać błędy, aby zobaczyć, jakie są te kluczowe ograniczenia i ostatecznie usunąć wszystkie tabele, ale chciałbym wiedzieć, czy istnieje szybki sposób na wymuszenie usunięcia wszystkich tabel (ponieważ będę mógł ponownie wstawić te, które nie chcę usunąć).

Google skierowało mnie do witryny, która zasugerowała następującą metodę:

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

Krótka odpowiedź brzmi: tak naprawdę nie pomogło, ponieważ otrzymałem ten sam błąd, podczas gdy mogłem usunąć więcej tabel. Widziałem w Stack Overflow sposoby na uzyskanie wszystkich kluczy obcych połączonych z określoną tabelą, ale jest to zbyt czasochłonne, chyba że skryptuję wszystko (co jest wykonalne w przypadku, gdy nie ma innej opcji)

Baza danych to 4.1, więc nie mogę jej używać DROP DATABASE

Pomysły?


1
Dlaczego wybrałeś wybraną odpowiedź, która nie daje nawet odpowiedzi na Twoje pytanie?
Sanjay

Odpowiedzi:


-40

Ponieważ nie chcesz przechowywać żadnych danych, usuń całą bazę danych i utwórz nową.


3
Ojej, czuję się teraz tak głupio, że zastępowałem słowo DATABASE rzeczywistą nazwą bazy danych zamiast dodawać ją później, dzięki obojgu +1
johnnyArt

13
to nie jest odpowiedź
Freelancer

8
To zabawne, gdy ta odpowiedź została zaznaczona i głosy w górę
tom10271

4
@RobertPounder to był dokładnie mój cel, odkąd dołączyłem do tej strony. Doceniam twój punkt widzenia.
Otávio Décio

3
@RobertPounder SO to coś więcej niż tylko pomoc dla operatorów operacyjnych, jest to zasób „jak to zrobić”, który można przeszukiwać. Wylądowałem w tym temacie, ponieważ musiałem wyłączyć sprawdzanie ograniczeń klucza obcego, a Google zaprowadził mnie tutaj. Cieszę się, że upuszczenie bazy danych było dobrym obejściem dla OP, ale poniższa odpowiedź jest w rzeczywistości poprawna w przypadku pytania „Wymuś upuszczenie mysql omijające ograniczenie klucza obcego”.
Val Redchenko,

404

Może to być przydatne dla kogoś, kto trafił tutaj z wyszukiwania. Upewnij się, że próbujesz upuścić tabelę, a nie widok .

SET Foreign_key_checks = 0;
- Upuść tabele
opuszczany stół ...
- Upuść widoki
upuść widok ...
SET Foreign_key_checks = 1;

SET foreign_key_checks = 0polega na wyłączeniu sprawdzania klucza obcego, a następnie SET foreign_key_checks = 1ponownym włączeniu sprawdzania klucza obcego. Gdy testy są wyłączone, tabele można porzucić, a następnie testy są ponownie włączane, aby zachować integralność struktury tabeli.


43
PAT to mój przyjaciel!
SeanDowney

5
To jest lepsza poprawna odpowiedź. Rozwiązuje problem, czy usuniesz wszystkie tabele, czy tylko kilka. Przerażający!
Luke Stevenson

@PAT Dziękuję bardzo, zadziałało. chociaż nie może działać w przeglądarce Mysql Query. Uratowałeś mi dzień.
MaNn

działało idealnie, użyłem tego, ponieważ nie mogę upuścić całej bazy danych
Pablo Pazos.

1
Zgadzam się, że jest to zwykle właściwe rozwiązanie, ale @johnnyArt, który zadał pytanie, wyraźnie wykluczył to jako realną opcję, ponieważ nie działa dla niego. Więc wydaje się, że to nie jest poprawna odpowiedź na pierwotne pytanie, prawda?
David

18

Jeśli używasz phpmyadmin, ta funkcja już istnieje.

  • Wybierz tabele, które chcesz usunąć
  • Z menu rozwijanego u dołu listy tabel wybierz opcję drop
  • Otworzy się nowa strona z polem wyboru u dołu z napisem „Sprawdzanie klucza obcego”, odznacz je.
  • Potwierdź usunięcie, akceptując „tak”.

3
Uratowałeś mi dzień! Dzięki! Działał jak urok!
Kami

4

Możesz wykonać następujące kroki, pomogło mi upuścić tabelę z ograniczeniem, rozwiązanie już wyjaśnione w powyższym komentarzu, właśnie dodałem zrzut ekranu -wprowadź opis obrazu tutaj


To jest duplikat odpowiedzi, która uzyskała najwyższą liczbę głosów, opublikowanej cztery lata wcześniej.
chb

3

Drop bazy danych istnieje we wszystkich wersjach MySQL. Ale jeśli chcesz zachować strukturę tabeli, oto pomysł

mysqldump --no-data --add-drop-database --add-drop-table -h NAZWA HOSTA -u NAZWA UŻYTKOWNIKA -p> dump.sql

To jest program, a nie polecenie mysql

Następnie zaloguj się do mysql i

source dump.sql;


1

Proste rozwiązanie pozwalające zrzucić cały stół na raz z terminala.

Wymagało to kilku kroków w Twojej powłoce mysql (choć nie było to rozwiązanie jednoetapowe), zadziałało i uratowało mi dzień.

Pracował dla wersji serwera: 5.6.38 MySQL Community Server (GPL)

Kroki, które wykonałem:

 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

Powłoka 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> 
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.