Forzar la caída de mysql sin pasar por la restricción de clave externa

134

Estoy tratando de eliminar todas las tablas de una base de datos, excepto una, y termino teniendo el siguiente error:

No se puede eliminar o actualizar una fila principal: falla una restricción de clave externa

Por supuesto, podría probar y error para ver cuáles son esas restricciones clave y, finalmente, eliminar todas las tablas, pero me gustaría saber si hay una manera rápida de forzar la eliminación de todas las tablas (ya que podré volver a insertar aquellas no quiero eliminar)

Google me apuntó a algún sitio que sugirió el siguiente método:

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

La respuesta corta es que realmente no funcionó, ya que terminé recibiendo el mismo error mientras podía eliminar algunas tablas más. He visto en Stack Overflow formas de vincular todas las claves externas a una determinada tabla, pero eso lleva demasiado tiempo a menos que lo escriba todo (lo que es factible en el caso de que no haya otra opción)

La base de datos es 4.1, así que no puedo usar DROP DATABASE

Ideas?

johnnyArt
fuente
1
¿Por qué elegiste la respuesta seleccionada que ni siquiera proporciona la solución a tu pregunta?
Sanjay

Respuestas:

-40

Como no está interesado en conservar ningún dato, descarte toda la base de datos y cree una nueva.

Otávio Décio
fuente
3
Oh, me siento tan estúpido ahora, estaba sustituyendo la palabra BASE DE DATOS con el nombre real de la base de datos en lugar de agregarla después, gracias a ambos +1
johnnyArt
13
esta no es la respuesta
Freelancer
8
Es gracioso ver que esta respuesta se marcó y votó a favor
tom10271
44
@RobertPounder ese era exactamente mi objetivo, y lo ha sido desde que me uní a este sitio. Agradezco tu punto de vista.
Otávio Décio
3
@RobertPounder SO es un poco más que solo ayudar a los OP, equivale a un recurso de "cómo" que se puede buscar, llegué a este tema porque necesitaba deshabilitar las comprobaciones de restricciones de clave externa, y Google me llevó aquí. Estoy feliz de que la eliminación de la base de datos haya sido una buena solución para el OP, pero la respuesta a continuación es correcta para la pregunta "Forzar la caída de mysql sin pasar por la restricción de clave externa".
Val Redchenko
404

Esto podría ser útil para alguien que termina aquí desde una búsqueda. Asegúrate de que estás intentando soltar una tabla y no una vista .

SET foreign_key_checks = 0;
- Tablas desplegables
mesa plegable ...
- Caída de vistas
vista de caída ...
SET foreign_key_checks = 1;

SET foreign_key_checks = 0consiste en desactivar las comprobaciones de clave externa y luego volver a activar SET foreign_key_checks = 1las comprobaciones de clave externa. Mientras las comprobaciones están apagadas, las tablas se pueden descartar, las comprobaciones se vuelven a activar para mantener la integridad de la estructura de la tabla.

PALMADITA
fuente
43
PAT es mi amigo!
SeanDowney
55
Esta es una mejor respuesta correcta. Resuelve el problema si se eliminan todas las tablas o solo algunas. ¡Estupendo!
Luke Stevenson el
@ PAT Muchas gracias, funcionó. aunque no podría funcionar en el navegador Mysql Query. Salvaste mi día .
MaNn
funcionó perfectamente, lo usé porque no puedo descartar toda la base de datos
Pablo Pazos
1
Estoy de acuerdo en que esta es normalmente la solución correcta, pero @johnnyArt, quien hizo la pregunta, excluyó específicamente esto como una opción viable porque no funcionó para él. Entonces parece que esta no es la respuesta correcta para la pregunta original, ¿verdad?
David
18

Si está utilizando phpmyadmin , esta función ya está allí.

  • Seleccione las tablas que desea soltar
  • En el menú desplegable al final de la lista de tablas, seleccione soltar
  • Se abrirá una nueva página con una casilla de verificación en la parte inferior que dice "Verificación de clave externa", desmarque.
  • Confirme la eliminación aceptando "sí".
Ali Azhar
fuente
3
Salvaste mi día ! ¡Gracias! ¡Trabajado como un encanto!
Kami
4

Puede usar los siguientes pasos, funcionó para mí soltar la tabla con restricciones, la solución ya se explicó en el comentario anterior, acabo de agregar una captura de pantalla para eso:ingrese la descripción de la imagen aquí

srinivas
fuente
Este es un duplicado de la respuesta más votada, publicada cuatro años antes.
chb
3

La base de datos de eliminación existe en todas las versiones de MySQL. Pero si quieres mantener la estructura de la tabla, aquí hay una idea

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

Este es un programa, no un comando mysql

Luego, inicie sesión en mysql y

fuente dump.sql;

MindStalker
fuente
1

Solución simple para soltar toda la tabla a la vez desde la terminal.

Esto implicó algunos pasos dentro de su shell mysql (aunque no es una solución de un solo paso), esto me funcionó y me salvó el día.

Funcionó para la versión del servidor: 5.6.38 MySQL Community Server (GPL)

Pasos que seguí:

 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 shell

$ 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> 
Sanjay
fuente