No se puede agregar o actualizar una fila secundaria: falla una restricción de clave externa

tabla 1

+----------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+----------------+ | UserID | int(11) | NO | PRI | NULL | auto_increment | | Password | varchar(20) | NO | | | | | Username | varchar(25) | NO | | | | | Email | varchar(60) | NO | | | | +----------+-------------+------+-----+---------+----------------+ 

Tabla 2

 +------------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------------+--------------+------+-----+---------+----------------+ | UserID | int(11) | NO | MUL | | | | PostID | int(11) | NO | PRI | NULL | auto_increment | | Title | varchar(50) | NO | | | | | Summary | varchar(500) | NO | | | | +------------------+--------------+------+-----+---------+----------------+ 

Error:

 com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`myapp/table2`, CONSTRAINT `table2_ibfk_1` FOREIGN KEY (`UserID`) REFERENCES `table1` (`UserID`)) 

¿Qué he hecho mal? Leo http://www.w3schools.com/Sql/sql_foreignkey.asp y no veo lo que está mal.

table2 este error porque está intentando agregar / actualizar una fila a la table2 que no tiene un valor válido para el campo table2 de table2 basado en los valores actualmente almacenados en la table1 . Si publica más código, puedo ayudarlo a diagnosticar la causa específica.

Significa que está intentando insertar en la table2 un valor table2 que no existe en la table1 .

Un simple truco puede ser desactivar las comprobaciones de claves externas antes de realizar cualquier operación en la tabla. Simplemente pregunta

 SET FOREIGN_KEY_CHECKS=0 

Esto deshabilitará la coincidencia de claves externas con otras tablas. Después de que haya terminado con la tabla, vuelva a habilitarlo

 SET FOREIGN_KEY_CHECKS=1 

Esto funciona para mí muchas veces.

Descubrí otro caso extraño: si accidentalmente creas una clave foránea de una tabla InnoDB a una tabla MyISAM, MySQL arroja este error al momento de insertar, incluso si los datos son válidos.

Ver http://nick.zoic.org/art/mysql-foreign-key-error/

Si ha insertado una fila en la tabla 1 antes de crear la clave externa en la tabla 2, obtendrá un error de restricción de clave externa, porque el valor de incremento automático es 2 en la tabla 1 y 1 en la tabla 2. Para resolver esto, debe trunque la tabla 1 y establezca el valor de incremento automático en 1. Luego puede agregar la tabla 2.

table2.UserID este error porque hay algún valor int table2.UserID que no existe en table1.UserID (supongo que ha table2.UserID valor de table2.UserID manualmente antes de crear esta clave foránea).
Un ejemplo para esta escena: table1.UserID get values ​​1,2,3 y table2.UserID get values ​​4 (agregar por manual). Por lo tanto, cuando crea una clave externa, no puede encontrar el ID de usuario UserID = 4 de la table1 y se producirá el error.
Para solucionar este error, simplemente elimine UserID = 4 de table2 o puede vaciarlos y luego crear la clave foránea y.
¡Buena suerte!

Acabo de tener el mismo problema, la solución es fácil.

Está intentando agregar una identificación en la tabla secundaria que no existe en la tabla principal.

compruebe bien, porque InnoDB tiene el error que a veces aumenta la columna auto_increment sin agregar valores, por ejemplo, INSERT ... ON DUPLICATE KEY

Asegúrese de haber configurado el motor de base de datos como InnoDB porque la clave externa y la transacción MyISAM no son compatibles

Tuve un problema similar. Está intentando aplicar una clave foránea en una tabla que tiene contenido y la columna no puede contener nulos. Tienes dos opciones.

  1. Haga que la columna sobre la que desea aplicar restricciones de clave externa sea anulable. De esta forma, la clave externa se aplicará sabiendo que algunos campos pueden ser anulables. ( Esto es lo que hice )
  2. Cree la columna en la que desea aplicar la restricción de clave externa, escriba una consulta para insertar la clave externa en la columna y luego aplique las restricciones de clave externa. ( No intenté esto, pero debería funcionar )

Asegúrese de que el valor que está insertando en la clave externa existe en la tabla principal. Eso me ayudó. Por ejemplo, si inserta user_id = 2 en la table.2 , pero table.1 no tiene un user_id = 2 , entonces la restricción arrojará un error. El mío era el código de error # 1452 para ser exacto. Espero que esto ayude a cualquier otra persona con el mismo problema.

Otro caso extraño que me dio este error. Hice referencia erróneamente a mis claves externas a la clave principal de identificación. Esto fue causado por comandos incorrectos de alterar la tabla. Descubrí esto consultando la tabla INFORMATION_SCHEMA (Vea esta respuesta de stackoverflow)

La tabla estaba tan confundida que no podía ser arreglada por ningún comando ALTER TABLE . Finalmente dejé caer la mesa y la reconstruí. Esto eliminó el error de integridad.

Tal vez mientras haya agregado la columna de userID , haya datos para esa determinada tabla que estén establecidos de modo que tengan un valor predeterminado de 0 , intente agregar la columna sin NOT NULL

También recibí este error: “No se puede agregar o actualizar una fila secundaria: falla una restricción de clave externa”. Obtuve el error al agregar una nueva fila a la tabla principal

El problema era que la restricción de clave externa se había definido en la tabla primaria en lugar de la tabla secundaria.

Si utiliza el índice de mysql o la relación entre tablas, primero borre las columnas (por ejemplo: city_id) y cree nuevas columnas con el mismo nombre (por ejemplo: city_id). Luego intente de nuevo …

También me enfrenté al mismo problema y el problema era que el valor de las entradas de la tabla padre no coincidía con el valor de la tabla de clave externa. Entonces por favor intente después de borrar todas las filas.

Tuve el mismo problema, y ​​la razón fue que tenía una fila en la primera tabla antes de agregar la clave externa.

La restricción de la clave externa de la tabla hija está fallando

Este problema puede boost debido a la siguiente razón:

Si lo está haciendo en Spring mvc, necesita describir explícitamente el tipo de id, porque a veces mysql no reconoce el tipo de id. por lo que establece explícitamente como en ambas tablas en su clase de entidad @GeneratedValue (strategy = GenerationType.IDENTITY)