update foreign fails error cómo corregir constraint como child cannot mysql foreign-keys mysql-error-1452

foreign - Mysql error 1452-No se puede agregar o actualizar una fila secundaria: falla una restricción de clave externa



cómo corregir el error “1452. cannot add or update a child row: a foreign key constraint fails” (20)

Estoy teniendo un pequeño problema. Estoy intentando agregar una clave externa a una tabla que hace referencia a otra, pero por algún motivo está fallando. Con mi conocimiento limitado de MySQL, lo único que podría sospecharse es que hay una clave externa en una tabla diferente que hace referencia a la que estoy tratando de hacer referencia.

Aquí hay una imagen de mis relaciones de tabla, generada a través de phpMyAdmin: Relationships

He realizado una consulta SHOW CREATE TABLE en ambas tablas, sourcecodes_tags es la tabla con la clave externa, sourcecodes es la tabla a la que se hace 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 lo que está pasando aquí, no he tenido una capacitación formal ni nada con MySQL :)

Gracias.

Editar: 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


Trunca las tablas y luego intente agregar la restricción FK .

Sé que esta solución es un poco incómoda pero funciona al 100%. Pero estoy de acuerdo en que esta no es una solución ideal para enfrentar un problema, pero espero que ayude.


Asegúrese de que el valor esté en la otra tabla; de lo contrario, obtendrá este error en la columna correspondiente asignada.

Por lo tanto, si la columna asignada está asignada a un ID de fila de otra tabla, asegúrese de que haya una fila en la tabla, de lo contrario aparecerá este error.


Es muy probable que su tabla sourcecodes_tags contenga valores sourcecode_id que ya no existen en su tabla sourcecodes . Tienes que deshacerte de esos primero.

Aquí hay una consulta que puede encontrar esos identificadores:

SELECT DISTINCT sourcecode_id FROM sourcecodes_tags tags LEFT JOIN sourcecodes sc ON tags.sourcecode_id=sc.id WHERE sc.id IS NULL;


Estaba preparando estas soluciones y este ejemplo puede ayudar.

Mi base de datos tiene dos tablas (correo electrónico y credit_card) con claves principales para sus ID. Otra tabla (cliente) se refiere a las ID de estas tablas como claves externas. Tengo una razón para tener el correo electrónico aparte de los datos del cliente.

Primero inserto los datos de la fila para las tablas a las que se hace referencia (correo electrónico, tarjeta de crédito), luego obtiene la ID de cada una, esas ID se necesitan en la tercera tabla (cliente).

Si no inserta primero las filas en las tablas a las que se hace referencia, MySQL no podrá hacer las correspondencias cuando inserte una nueva fila en la tercera tabla que haga referencia a las claves externas.

Si primero inserta las filas a las que se hace referencia para las tablas a las que se hace referencia, entonces la fila que hace referencia a las claves externas, no se produce ningún error.

Espero que esto ayude.


Esto también sucede cuando se configura una clave foránea para parent.id para child.column si child.column ya tiene un valor de 0 y ningún valor parent.id es 0

Necesitará asegurarse de que cada child.column sea NULL o tenga un valor que exista en parent.id

Y ahora que leí la declaración que escribimos, eso es lo que está validando.


Para mí, este problema fue un poco diferente y muy fácil de revisar y resolver.

Debe asegurarse de que AMBAS de sus tablas sean InnoDB. Si una de las tablas, a saber, la tabla de referencia es un MyISAM, la restricción fallará.

SHOW TABLE STATUS WHERE Name = ''t1''; ALTER TABLE t1 ENGINE=InnoDB;


Parece que hay algún valor no válido para la columna como 0 que no es una clave externa válida, por lo que MySQL no puede establecer una restricción de clave externa para ella.

Puedes seguir estos pasos:

  1. Suelte la columna para la que ha intentado establecer la restricción FK.

  2. Vuélvalo a agregar y establezca su valor predeterminado como NULL.

  3. Intenta establecer una restricción de clave externa para ello de nuevo.


Puedes probar este ejemplo

START TRANSACTION; SET foreign_key_checks = 0; ALTER TABLE `job_definers` ADD CONSTRAINT `job_cities_foreign` FOREIGN KEY (`job_cities`) REFERENCES `drop_down_lists`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; SET foreign_key_checks = 1; COMMIT;

Nota: si está utilizando phpmyadmin, simplemente desactive la opción Habilitar comprobaciones de clave externa

como ejemplo

Espero que esta solución solucione tu problema :)



Tenía el mismo problema, revisé las filas de mis tablas y descubrí que había alguna incompatibilidad con el valor de los campos que quería definir como clave externa. Corrigí ese valor, lo intenté de nuevo y el problema se resolvió.


Tengo una solución, solo necesitas responder una pregunta:

¿Tu mesa ya está almacenando datos? Especialmente la tabla incluida la clave externa.

Si la respuesta es sí, entonces lo único que hace es eliminar todo el registro y luego puede agregar cualquier clave externa en su tabla.

Eliminar instrucción: De hijo (que incluye tabla de clave externa) a tabla principal.

La razón por la que no puede agregar una clave externa después de las entradas de datos se debe a la incoherencia de la tabla, ¿qué va a tratar con la nueva clave externa en la tabla anterior llena de datos?

Si no, siga las instrucciones de otros.


Termino borrando todos los datos en mi tabla, y ejecuto alter nuevamente. Funciona. No es la brillante, pero ahorra mucho tiempo, especialmente su aplicación aún está en fase de desarrollo sin datos de clientes.


Tuve el mismo problema con mi base de datos mysql pero finalmente obtuve una solución que funcionó para mí.
Ya que en mi tabla todo estaba bien desde el punto de vista de mysql (ambas tablas deberían usar el motor Innodb y el tipo de datos de cada columna debería ser del mismo tipo que forma parte de la restricción de clave externa).
Lo único que hice fue deshabilitar la verificación de la clave foránea y luego habilitarla después de realizar la operación de la clave foránea.
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;


Tuve el mismo problema hoy. Probé cuatro cosas, algunas de ellas ya mencionadas aquí:

  1. ¿Hay algún valor en su columna secundaria que no exista en la columna principal (además de NULL, si la columna secundaria es anulable)?

  2. ¿Las columnas hijo y padre tienen el mismo tipo de datos?

  3. ¿Hay un índice en la columna principal a la que hace referencia? MySQL parece requerir esto por razones de rendimiento ( http://dev.mysql.com/doc/refman/5.5/en/create-table-foreign-keys.html )

  4. Y éste lo resolvió por mí: ¿Ambas tablas tienen una intercalación idéntica?

Tenía una mesa en utf-8 y la otra en iso-algo. Eso no funcionó. Después de cambiar la iso-table a utf-8 colation, las restricciones podrían agregarse sin problemas. En mi caso, phpMyAdmin ni siquiera mostró la tabla secundaria en codificación ISO en el menú desplegable para crear la restricción de clave externa.


Tuve el mismo problema y encontré una solución, colocando NULL lugar de NOT NULL en una columna de clave externa. Aquí hay una consulta:

ALTER TABLE `db`.`table1` ADD COLUMN `col_table2_fk` INT UNSIGNED NULL, ADD INDEX `col_table2_fk_idx` (`col_table2_fk` ASC), ADD CONSTRAINT `col_table2_fk1` FOREIGN KEY (`col_table2_fk`) REFERENCES `db`.`table2` (`table2_id`) ON DELETE NO ACTION ON UPDATE NO ACTION;

MySQL ha ejecutado esta consulta!


Tuve exactamente el mismo problema en tres ocasiones diferentes. En cada caso se debió a que uno (o más) de mis registros no se ajustaba a la nueva clave externa. Es posible que desee actualizar sus registros existentes para seguir las restricciones de sintaxis de la clave externa antes de intentar agregar la clave. El siguiente ejemplo generalmente debería aislar los registros de problemas:

SELECT * FROM (tablename) WHERE (candidate key) <> (proposed foreign key value) AND (candidate key) <> (next proposed foreign key value)

repita AND (candidate key) <> (next proposed foreign key value) dentro de su consulta para cada valor en la clave foránea.

Si tiene un montón de registros, esto puede ser difícil, pero si su mesa es razonablemente pequeña, no debería tomar mucho tiempo. No soy súper sorprendente en la sintaxis SQL, pero esto siempre me ha aislado el problema.


Utilice NOT IN para encontrar dónde están restringidas las restricciones :

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

así, más específicamente:

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

EDITAR: Los operadores IN y NOT IN son mucho más rápidos que los operadores JOIN , así como mucho más fáciles de construir y repetir.


Vacíe los datos de ambas tablas y ejecute el comando. Funcionará.


prueba esto

SET foreign_key_checks = 0; ALTER TABLE sourcecodes_tags ADD FOREIGN KEY (sourcecode_id) REFERENCES sourcecodes (id) ON DELETE CASCADE ON UPDATE CASCADE SET foreign_key_checks = 1;


UPDATE sourcecodes_tags SET sourcecode_id = NULL WHERE sourcecode_id NOT IN ( SELECT id FROM sourcecodes);

Debe ayudar a deshacerse de esas identificaciones. O si no se permite null en sourcecode_id , elimine esas filas o agregue los valores faltantes a la tabla de sourcecodes