Forza drop mysql bypassando il vincolo di chiave esterna


134

Sto cercando di eliminare tutte le tabelle da un database tranne uno e finisco per avere il seguente errore:

Impossibile eliminare o aggiornare una riga principale: un vincolo di chiave esterna non riesce

Ovviamente potrei provare ed errore per vedere quali sono questi vincoli chiave ed eventualmente eliminare tutte le tabelle, ma mi piacerebbe sapere se esiste un modo rapido per forzare l'eliminazione di tutte le tabelle (poiché potrò reinserire quelle che non voglio essere eliminato).

Google mi ha indirizzato verso alcuni siti che suggerivano il seguente metodo:

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

La risposta breve è che non ha davvero funzionato da quando ho finito per ricevere lo stesso errore mentre ero in grado di eliminare alcune altre tabelle. Ho visto su Stack Overflow modi per ottenere tutte le chiavi esterne collegate a una determinata tabella, ma è troppo dispendioso in termini di tempo a meno che non scrivo tutto (il che è fattibile nel caso in cui non ci siano altre opzioni)

Il database è 4.1, quindi non posso usarlo DROP DATABASE

Idee?


1
Perché hai scelto la risposta selezionata che non fornisce nemmeno la soluzione alla tua domanda?
Sanjay,

Risposte:


-40

Poiché non sei interessato a conservare alcun dato, elimina l'intero database e creane uno nuovo.


3
Oh mio Dio, mi sento così stupido ora, stavo sostituendo la parola DATABASE con il vero nome del database invece di aggiungerlo in seguito, grazie sia +1
johnnyArt

13
questa non è la risposta
professionista,

8
È divertente vedere che questa risposta è stata spuntata e votata
tom10271

4
@RobertPounder che era esattamente il mio obiettivo, ed è stato da quando sono entrato in questo sito. Apprezzo il tuo punto di vista
Otávio Décio,

3
@RobertPounder SO è un po 'più che aiutare i PO, equivale a una risorsa "come" ricercabile, sono approdato su questo argomento perché avevo bisogno di disabilitare i controlli dei vincoli di chiave esterna e Google mi ha guidato qui. Sono contento che il rilascio del database sia stato una buona soluzione per l'OP, ma la risposta che segue è in realtà corretta per la domanda "Forza drop mysql bypassando il vincolo di chiave esterna".
Val Redchenko,

404

Questo potrebbe essere utile per qualcuno che finisce qui da una ricerca. Assicurati di provare a eliminare una tabella e non una vista .

SET foreign_key_checks = 0;
- Elimina tabelle
drop table ...
- Rilasciare le visualizzazioni
drop view ...
SET foreign_key_checks = 1;

SET foreign_key_checks = 0consiste nel disattivare i controlli delle chiavi esterne e quindi SET foreign_key_checks = 1nel ripristinare i controlli delle chiavi esterne. Mentre i controlli sono disattivati, le tabelle possono essere eliminate, i controlli vengono quindi riattivati ​​per mantenere l'integrità della struttura della tabella.


43
PAT è mio amico!
SeanDowney,

5
Questa è una risposta migliore e corretta. Risolve il problema eliminando tutte le tabelle o solo alcune. Eccezionale!
Luke Stevenson,

@PAT Grazie mille, ha funzionato. sebbene non possa funzionare nel browser di query Mysql. Mi hai salvato la giornata.
MaNn

ha funzionato perfettamente, l'ho usato perché non riesco a eliminare l'intero database
Pablo Pazos,

1
Concordo sul fatto che questa è normalmente la soluzione giusta ma @johnnyArt, che ha posto la domanda, l'ha esclusa in modo specifico come opzione praticabile perché non ha funzionato per lui. Quindi sembra che questa non sia la risposta corretta alla domanda originale, vero?
David,

18

Se stai usando phpmyadmin, questa funzione è già disponibile.

  • Seleziona le tabelle che desideri eliminare
  • Dal menu a discesa in fondo all'elenco delle tabelle, seleziona drop
  • Verrà aperta una nuova pagina con la casella in basso che dice "Controllo chiave esterna", deselezionala.
  • Conferma l'eliminazione accettando "si".

3
Mi hai salvato la giornata! Grazie! Ha funzionato come un fascino!
Kami,

4

Puoi utilizzare i seguenti passaggi, ha funzionato per me eliminare la tabella con vincolo, soluzione già spiegata nel commento sopra, ho appena aggiunto una schermata per quello -inserisci qui la descrizione dell'immagine


Questo è un duplicato della risposta più votata, pubblicata quattro anni prima.
chb

3

Il database di rilascio esiste in tutte le versioni di MySQL. Ma se vuoi mantenere la struttura della tabella, ecco un'idea

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

Questo è un programma, non un comando mysql

Quindi, accedi a mysql e

fonte dump.sql;


1

Soluzione semplice per eliminare tutta la tabella contemporaneamente dal terminale.

Ciò ha comportato alcuni passaggi all'interno della tua shell mysql (non una soluzione in un solo passaggio), mi ha funzionato e mi ha salvato la giornata.

Ha funzionato per la versione Server: 5.6.38 MySQL Community Server (GPL)

I passaggi che ho seguito:

 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

Shell 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> 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.