227 votos

Error Mysql 1452 - No puede agregar o actualizar un niño de la fila: una restricción de clave externa falla

Estoy teniendo un poco de un extraño problema, estoy tratando de agregar una clave externa de una tabla que hace referencia a otro, sino que está fallando por algún motivo. Con mis limitados conocimientos de MySQL, la única cosa que se podía sospechar es que no es una clave foránea en una tabla diferente de hacer referencia a las que estoy tratando de referencia.

Aquí está una foto de mi mesa de relaciones, se genera a través de phpMyAdmin: Relaciones

He hecho un SHOW CREATE TABLE consulta en ambas tablas, sourcecodes_tags es la tabla con la clave externa, procesa tanto código fuente es la tabla de referencia.

CREATE TABLE `sourcecodes` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `user_id` int(11) unsigned NOT NULL,
 `language_id` int(11) unsigned NOT NULL,
 `category_id` int(11) unsigned NOT NULL,
 `title` varchar(40) CHARACTER SET utf8 NOT NULL,
 `description` text CHARACTER SET utf8 NOT NULL,
 `views` int(11) unsigned NOT NULL,
 `downloads` int(11) unsigned NOT NULL,
 `time_posted` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
 PRIMARY KEY (`id`),
 KEY `user_id` (`user_id`),
 KEY `language_id` (`language_id`),
 KEY `category_id` (`category_id`),
 CONSTRAINT `sourcecodes_ibfk_3` FOREIGN KEY (`language_id`) REFERENCES `languages` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
 CONSTRAINT `sourcecodes_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
 CONSTRAINT `sourcecodes_ibfk_2` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1

CREATE TABLE `sourcecodes_tags` (
 `sourcecode_id` int(11) unsigned NOT NULL,
 `tag_id` int(11) unsigned NOT NULL,
 KEY `sourcecode_id` (`sourcecode_id`),
 KEY `tag_id` (`tag_id`),
 CONSTRAINT `sourcecodes_tags_ibfk_1` FOREIGN KEY (`tag_id`) REFERENCES `tags` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1

Sería genial si alguien pudiera decirme qué está pasando aquí, no he tenido ningún entrenamiento formal o nada con MySQL :)

Gracias.

Edit: Este es el código que genera el error:

ALTER TABLE sourcecodes_tags ADD FOREIGN KEY (sourcecode_id) REFERENCES sourcecodes (id) ON DELETE CASCADE ON UPDATE CASCADE

220voto

nos Puntos 102226

Es muy probable que su sourcecodes_tags tabla contiene sourcecode_id valores que ya no existe en su sourcecodes tabla. Usted tiene que deshacerse de aquellos primeros.

He aquí una consulta que puede encontrar esos Identificadores:

select sourcecode_id from 
   sourcecodes_tags tags left join sourcecodes sc on tags.sourcecode_id=sc.id 
where sc.id is null;

91voto

Prakash Puntos 459

Yo tenía el mismo problema con mi base de datos mysql, pero finalmente me dieron una solución que funcionó para mí.
Ya que en mi mesa, todo estaba bien desde mysql punto de vista(tanto de la tabla debe usar motor Innodb y el tipo de dato de cada columna deben ser del mismo tipo que tomar parte en la restricción de clave externa).
Única cosa que hice fue deshabilitar la clave externa de verificación y más tarde se le permitió después de la realización de clave externa de la operación.
Los pasos que tomé:

mysql> SET foreign_key_checks = 0;

mysql> alter table tblUsedDestination add constraint f_operatorId foreign key(iOperatorId) references tblOperators (iOperatorId); Query
OK, 8 rows affected (0.23 sec) Records: 8  Duplicates: 0  Warnings: 0

mysql> SET foreign_key_checks = 1;

55voto

Uso NOT IN a encontrar donde las restricciones son limitativas:

SELECT column FROM table WHERE column NOT IN 
(SELECT intended_foreign_key FROM another_table)

por lo tanto, más específicamente:

SELECT sourcecode_id FROM sourcecodes_tags WHERE sourcecode_id NOT IN 
(SELECT id FROM sourcecodes)

EDIT: IN y NOT IN operadores son conocidas por ser mucho más rápido que el JOIN de los operadores, así como mucho más fácil de construir, y repetir.

23voto

Shankar Damodaran Puntos 39934

Truncar las tablas y, a continuación, pruebe a añadir el FK Restricción.

Sé que esta solución es un poco incómodo pero funciona 100%. Pero estoy de acuerdo que esto no es una solución ideal para lidiar con el problema, pero espero que ayude.

14voto

fyrye Puntos 119

Esto también ocurre cuando la configuración de una clave externa a los padres.id del niño.columna si el niño.la columna tiene un valor de 0 y ya no de los padres.valor de id es 0

Usted tendría que asegurarse de que cada niño.la columna es NULL o el valor que existe en los padres.id

Y ahora que he leído la declaración nos escribió, que es lo que se está validando.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X