Fallo de la restricción de clave externa falsa

Recibo este mensaje de error:

ERROR 1217 (23000) en la línea 40: No se puede eliminar o actualizar una fila primaria: falla una restricción de clave externa

… cuando trato de dejar caer una mesa:

DROP TABLE IF EXISTS `area`; 

… definido así:

 CREATE TABLE `area` ( `area_id` char(3) COLLATE utf8_spanish_ci NOT NULL, `nombre_area` varchar(30) COLLATE utf8_spanish_ci NOT NULL, `descripcion_area` varchar(100) COLLATE utf8_spanish_ci NOT NULL, PRIMARY KEY (`area_id`), UNIQUE KEY `nombre_area_UNIQUE` (`nombre_area`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci; 

Lo curioso es que ya eliminé todas las demás tablas en el esquema que tienen claves foráneas en el area . En realidad, la base de datos está vacía a excepción de la tabla de area .

¿Cómo puede tener filas secundarias si no hay ningún otro objeto en la base de datos? Por lo que sé, InnoDB no permite claves externas en otros esquemas, ¿o sí?

(Incluso puedo ejecutar un RENAME TABLE area TO something_else comando: -?)

Dos posibilidades:

  1. Hay una tabla dentro de otro esquema (“base de datos” en la terminología de mysql) que tiene una referencia FK
  2. El diccionario interno de datos innodb no está sincronizado con el mysql.

Puede ver qué tabla era (una de ellas, de todos modos) al hacer una “SHOW ENGINE INNODB STATUS” después de que la caída falla.

Si resulta ser el último caso, podría volcar y restaurar todo el servidor si es posible.

MySQL 5.1 y superior le dará el nombre de la tabla con el FK en el mensaje de error.

A pedido, ahora como una respuesta …

Al utilizar MySQL Query Browser o phpMyAdmin, parece que se abre una nueva conexión para cada consulta ( bugs.mysql.com/bug.php?id=8280 ), por lo que es necesario escribir todas las instrucciones desplegables en una consulta, por ejemplo.

 SET FOREIGN_KEY_CHECKS=0; DROP TABLE my_first_table_to_drop; DROP TABLE my_second_table_to_drop; SET FOREIGN_KEY_CHECKS=1; 

Donde el SET FOREIGN_KEY_CHECKS=1 sirve como una medida de seguridad adicional …

Deshabilitar la verificación de clave externa

 SET FOREIGN_KEY_CHECKS=0 

de este blog :

Puede desactivar temporalmente las comprobaciones de claves externas:

 SET FOREIGN_KEY_CHECKS=0; 

Solo asegúrate de restaurarlos cuando hayas terminado de jugar:

 SET FOREIGN_KEY_CHECKS=1; 

con suerte su trabajo

SET foreign_key_checks = 0; DROP TABLE table name ; SET foreign_key_checks = 1;

En Rails, uno puede hacer lo siguiente usando la rails console :

 connection = ActiveRecord::Base.connection connection.execute("SET FOREIGN_KEY_CHECKS=0;") 

Tal vez haya recibido un error al trabajar con esta tabla anteriormente. Puede cambiar el nombre de la tabla e intentar eliminarla nuevamente.

 ALTER TABLE `area` RENAME TO `area2`; DROP TABLE IF EXISTS `area2`; 

Encontré una solución fácil, exporté la base de datos, edité lo que desea editar en un editor de texto y luego lo importé. Hecho

No se puede eliminar o actualizar una fila primaria: falla una restricción de clave externa ( user_role . user_role , CONSTRAINT FK143BF46A8dsfsfds@#5A6BD60 FOREIGN KEY ( user_id ) REFERENCES user ( id ))

Lo que hice en dos simples pasos. primero elimino la fila hijo en la tabla hija como

mysql> delete from table2 donde role_id = 2 && user_id = 20;

Consulta OK, 1 fila afectada (0.10 seg)

y el segundo paso es eliminar el padre

eliminar de la tabla 1 donde id = 20;

Consulta OK, 1 fila afectada (0.12 seg)

Con esto resuelvo el problema que significa “Eliminar hijo” y luego “Eliminar padre”.

Espero que lo tengas 🙂