2010-07-26 14 views
106

me sale este mensaje de error:falso de restricción de clave externa fall

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

... cuando intento eliminar una tabla:

DROP TABLE IF EXISTS `area`; 

... se define 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 se me cayó todas las otras tablas en el esquema que tiene las claves externas contra area. En realidad, la base de datos está vacía a excepción de la tabla area.

¿Cómo es posible que haya 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 comando RENAME TABLE area TO something_else: -?)

+0

¿Es posible que la tabla forme parte de una relación Referencial-Integridad en otro esquema? –

+0

Tengo algunas otras copias de la aplicación, así que siempre es posible. Sin embargo, la sintaxis que uso es básicamente 'CONSTRAINT fk_servicio_area1 FOREIGN KEY (area_id) REFERENCES area (area_id)', es decir, no hay un nombre de esquema en la referencia de la tabla: -? –

Respuesta

99

dos posibilidades:

  1. hay una mesa dentro de otro esquema ("base de datos "en la terminología de mysql" que tiene una referencia FK
  2. El diccionario interno de datos de innodb no está sincronizado con el mi sql uno.

Puede ver de qué mesa se trataba (una de ellas, de todos modos) al hacer un "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.

+0

Ya no puedo reproducir el problema. El diccionario fuera de sincronismo se destaca como una razón probable. Lo probaré todo el día y veré el informe de 'SHOW ENGINE INNODB STATUS'. –

+3

¡Gracias por esta respuesta! Tenía una tabla de muchos a muchos que seguía haciendo referencia a la tabla que no podíamos eliminar, así que tuve que soltar esa tabla primero. –

+0

¡genial! me salvó las horas –

47

clave externa Inhabilitar la verificación de

SET FOREIGN_KEY_CHECKS=0 
+62

El comando correcto parece ser 'SET FOREIGN_KEY_CHECKS = 0' y arregla el mensaje de error. ¿Tiene alguna idea de por qué es necesario? ¿Las claves externas se almacenan en caché incluso después de que las tablas se hayan ido? –

+1

Bueno, para decir la verdad, no tengo idea de por qué surge ese problema, pero asegúrese de desactivar la comprobación de claves cada vez que realice cambios o actualizaciones importantes. Me ha pasado varias veces, dejándome sin dormir durante días. –

+55

¡Asegúrate de 'SET FOREIGN_KEY_CHECKS = 1; 'una vez que hayas terminado! –

0

Quizás 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`; 
121

En la demanda, 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 recurrir a escribir todo las declaraciones de soltar en una consulta, ej.

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 ...

+2

Para aquellos que crean un volcado usando phpMyAdmin, hay una opción "Desactivar verificación de clave externa" que agregará automáticamente "SET FOREIGN_KEY_CHECKS = 0;' al comienzo del volcado. – Mike

+0

Parece que phpMyAdmin ha implementado esta encantadora función, ¡ahora estoy esperando que mysqlWorkbench haga lo mismo! :) –

+0

@CodeMed FYI, acepté la respuesta de MarkR porque proporciona una explicación del problema que tiene sentido, aunque admito que no pude verificarlo ya que no me he enfrentado a este mismo problema en los 6 años siguientes, ni siquiera una vez . Esta y las respuestas anteriores proporcionan una solución alternativa (excelente para ese bien) pero en realidad no abordan la pregunta en sí y, como solo puede aceptar una respuesta, tuve que elegir. –

28

de this blog:

Puede desactivar temporalmente los controles clave externa:

SET FOREIGN_KEY_CHECKS=0; 

Sólo asegúrese de restaurarlos una vez que haya terminado de jugar un poco:

SET FOREIGN_KEY_CHECKS=1; 
+0

Buena respuesta, ya desarrollaba en local :) – Adelin

+0

Mejor respuesta ... fácil y funciona como un encanto –

+0

Es una solución válida (puedo confirmar que funciona) pero la entrada del blog vinculado realmente no habla sobre el escenario en esta pregunta (una base de datos que ya está vacía, guarde para una tabla). –

6

de esperar su labor

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

+0

Sí, funciona, ya que las varias veces se ha mencionado antes ;-) –

1

En Los Carriles, uno puede hacer lo siguiente con el rails console:

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

No se puede eliminar o actualizar una fila padre:. Una restricción de clave externa falla (table1user_role, CONSTREÑIMIENTO [email protected]#5A6BD60 FOREIGN KEY (user_id) Referencias user (id))

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

mysql> eliminar de la tabla 2 donde role_id = 2 & & user_id = 20;

Query OK, 1 fila afectada (0,10 seg)

y segundo paso como borrar el padre

eliminar de tabla1 donde id = 20;

Query OK, 1 fila afectada (0,12 seg)

Con esto quiero resolver el problema que significa Eliminar niño luego Eliminar padres

espero lo tienes. :)

+0

Lea la pregunta nuevamente. No puedes eliminar una tabla que no existe. –

+0

Mi respuesta es con respecto a si existe la tabla .. –

+0

en este escenario podemos eliminar la restricción de clave externa y luego intentar eliminar la tabla. podemos soltar una clave externa como esta ALTER TABLE DROP CONSTRAINT

0

encontré una solución fácil, exportar la base de datos, editar lo que desea editar en un editor de texto, luego importarlo. Hecho

+3

Esa es una solución interesante, que probablemente no debería suceder. En cambio, todo lo que se debe cambiar debe hacerse a través del DBMS. La edición de un volcado de base de datos en un editor de texto parece ser una vía madura para los problemas. –

+1

Realmente no entiendo lo que te gusta. Volcar la base de datos, eliminar el código 'CREATE TABLE' y cargar el volcado de nuevo ... no hará que MySQL elimine la tabla. Y si se refiere a restaurar el volcado en una nueva base de datos ... Si quiere borrar todas las tablas como yo, una base de datos recién creada ya estará vacía. Si desea mantener algunas tablas, la solución 'SET FOREIGN_KEY_CHECKS = 0' mencionada aquí funciona bien y es más simple; y probablemente no necesite editar el volcado porque la nueva copia de sus datos posiblemente no tendrá un diccionario de datos fuera de sincronización. –

Cuestiones relacionadas