Error de 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 principal: a falla la restricción de clave externa

... cuando intento dejar caer una tabla:

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 otras tablas en el esquema que tienen claves foráneas contra area. En realidad, la base de datos está vacía excepto por la tabla 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 foráneas en otros esquemas, ¿verdad?

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

 107
Author: Álvaro González, 2010-07-26

9 answers

Dos posibilidades:

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

Puede ver qué tabla era (una de ellas, de todos modos) haciendo un "SHOW ENGINE INNODB STATUS" después de que falle la caída.

Si resulta ser el último caso, me gustaría dump y restore 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.

 99
Author: MarkR,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-26 12:58:22

A petición, 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 drop 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 medida de seguridad adicional...

 121
Author: Karlis Rode,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-07 20:06:37

Desactivar la comprobación de clave externa

SET FOREIGN_KEY_CHECKS=0
 47
Author: Flakron Bytyqi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-01 14:27:47

De este blog:

Puede desactivar temporalmente las comprobaciones de claves foráneas:

SET FOREIGN_KEY_CHECKS=0;

Solo asegúrese de restaurarlos una vez que haya terminado de jugar:

SET FOREIGN_KEY_CHECKS=1;
 28
Author: JackD,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-19 07:49:17

Esperemos que su trabajo

SET foreign_key_checks = 0; TABLA DE CAÍDA table name; SET foreign_key_checks = 1;

 6
Author: M_ Fa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-26 17:31:22

En Rails, se puede hacer lo siguiente usando el rails console:

connection = ActiveRecord::Base.connection
connection.execute("SET FOREIGN_KEY_CHECKS=0;")
 1
Author: yeyo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-07 19:20:15

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

ALTER TABLE `area` RENAME TO `area2`;
DROP TABLE IF EXISTS `area2`;
 0
Author: Vadim Pluzhinsky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-08 15:46:38

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

 0
Author: Abdulrahman K,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-08 21:43:19

No puede eliminar o actualizar una fila principal: una restricción de clave foránea falla (table1.user_role, CONSTRAINT FK143BF46A8dsfsfds@#5A6BD60 FOREIGN KEY (user_id) REFERENCIAS user (id))

Lo que hice en dos sencillos pasos . primero borro la fila secundaria en la tabla secundaria como

Mysql> eliminar de tabla2 donde role_id = 2 & & user_id =20;

Consulta OK, 1 fila afectada (0.10 seg)

Y segundo paso como eliminar el padre

Suprímase 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. :)

 -1
Author: Aadil Masavir,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-18 14:17:32