mysql - tipos - Fallo de la restricción de clave externa falsa
no se puede agregar o actualizar una fila secundaria falla una restricción de clave externa (9)
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 ...
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: -?)
Deshabilitar la verificación de clave externa
SET FOREIGN_KEY_CHECKS=0
Dos posibilidades:
- Hay una tabla dentro de otro esquema ("base de datos" en la terminología de mysql) que tiene una referencia FK
- 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.
En Rails, uno puede hacer lo siguiente usando la rails console
:
connection = ActiveRecord::Base.connection
connection.execute("SET FOREIGN_KEY_CHECKS=0;")
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 :)
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`;
con suerte su trabajo
SET foreign_key_checks = 0; DROP TABLE table name
; SET foreign_key_checks = 1;
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;