Recibo este mensaje de error:
ERROR 1217 (23000) en la línea 40: No se puede eliminar o actualizar una fila principal: falla una restricción de clave externa
... cuando intento 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 del esquema que tienen claves externas en contra area
. En realidad, la base de datos está vacía a excepción de la area
tabla.
¿Cómo es posible que tenga filas secundarias si no hay ningún otro objeto en la base de datos? Hasta donde yo sé, InnoDB no permite claves externas en otros esquemas, ¿verdad?
(Incluso puedo ejecutar un RENAME TABLE area TO something_else
comando: -?)
CONSTRAINT fk_servicio_area1 FOREIGN KEY (area_id) REFERENCES area (area_id)
, es decir, sin nombre de esquema en la referencia de la tabla: -?Respuestas:
Dos posibilidades:
Puede ver qué tabla era (una de ellas, de todos modos) haciendo un "MOSTRAR ESTADO INNODB DEL MOTOR" después de que falla la caída.
Si resulta ser el último caso, volcaría y restauraría todo el servidor si puede.
MySQL 5.1 y superior le dará el nombre de la tabla con el FK en el mensaje de error.
fuente
SHOW ENGINE INNODB STATUS
informes.A pedido, ahora como respuesta ...
Cuando se utiliza 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 sentencias de caída en una consulta, por ejemplo.
Donde el
SET FOREIGN_KEY_CHECKS=1
sirve como medida de seguridad extra ...fuente
SET FOREIGN_KEY_CHECKS=0;
al comienzo del volcado.Deshabilitar la verificación de clave externa
fuente
SET FOREIGN_KEY_CHECKS=0
y soluciona el mensaje de error. ¿Tiene alguna idea de por qué es necesario? ¿Se almacenan en caché las claves externas incluso después de que las tablas se han ido?SET FOREIGN_KEY_CHECKS=1;
después de que hayas terminado!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 SET FOREIGN_KEY_CHECKS = 1 sirve como una medida de seguridad adicional ...de este blog :
Puede deshabilitar temporalmente las comprobaciones de claves externas:
Solo asegúrese de restaurarlos una vez que haya terminado de jugar:
fuente
con suerte su trabajo
SET Foreign_key_checks = 0; TABLA DE GOTA
table name
; SET Foreign_key_checks = 1;fuente
En Rails, se puede hacer lo siguiente usando
rails console
:fuente
Tal vez recibió un error al trabajar con esta tabla antes. Puede cambiar el nombre de la tabla e intentar eliminarla nuevamente.
fuente
Encontré una solución fácil, exportar la base de datos, editar lo que desea editar en un editor de texto y luego importarlo. Hecho
fuente
CREATE TABLE
código y cargar el volcado nuevamente ... no hará que MySQL elimine la tabla. Y si te refieres a restaurar el volcado en una nueva base de datos ... Si quieres borrar todas las tablas como yo, una base de datos recién creada ya estará vacía. Si desea conservar algunas tablas, laSET FOREIGN_KEY_CHECKS=0
solución alternativa mencionada en todas partes aquí funciona bien y es más simple; y probablemente no necesite editar el volcado de todos modos, ya que la nueva copia de sus datos posiblemente no tendrá un diccionario de datos desincronizado.No se puede eliminar o actualizar una fila principal: falla una restricción de clave externa (
table1
.user_role
, CONSTRAINTFK143BF46A8dsfsfds@#5A6BD60
FOREIGN KEY (user_id
) REFERENCESuser
(id
))Lo que hice en dos sencillos pasos. primero elimino la fila secundaria en la tabla secundaria como
mysql> eliminar de la tabla2 donde role_id = 2 && user_id = 20;
Consulta correcta, 1 fila afectada (0,10 segundos)
y segundo paso como eliminar el padre
eliminar de la tabla1 donde id = 20;
Consulta correcta, 1 fila afectada (0,12 segundos)
Con esto resuelvo el problema que significa eliminar hijo y luego eliminar padre
Espero que lo tengas. :)
fuente