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? Leí http://www.w3schools.com/Sql/sql_foreignkey.asp y no veo qué pasa.
table2.UserID
que no existe entable1.UserID
.Respuestas:
Obtiene este error porque está intentando agregar / actualizar una fila
table2
que no tiene un valor válido para elUserID
campo en función de los valores almacenados actualmentetable1
. Si publicas más código, puedo ayudarte a diagnosticar la causa específica.fuente
Significa que está intentando insertar en
table2
unUserID
valor que no existetable1
.fuente
Un truco simple puede ser desactivar las comprobaciones de clave externa antes de realizar cualquier operación en la tabla. Simplemente consulta
Esto deshabilitará la coincidencia de claves foráneas con cualquier otra tabla. Una vez que haya terminado con la tabla, vuelva a habilitarla
Esto me funciona muchas veces.
fuente
Descubrí otro caso extraño: si accidentalmente crea una clave foránea desde una tabla InnoDB a una tabla MyISAM, MySQL arroja este error al momento de la inserción, incluso si los datos son válidos.
Ver http://nick.zoic.org/art/mysql-foreign-key-error/
fuente
Obtiene este error porque hay algún valor int
table2.UserID
que no existetable1.UserID
(supongo que ha establecido eltable2.UserID
valor manualmente antes de crear esta clave foránea).Un ejemplo para esta escena:
table1.UserID
obtener los valores 1,2,3 ytable2.UserID
obtener los valores 4 (agregar por manual). Así que cuando usted hace una clave externa, que no pueden encontrarUserID = 4
a partirtable1
y el error será ocurse.Para solucionar este error, acaba de quitar
UserID = 4
detable2
o puede vaciar ambos y luego crear la clave externa y.¡Buena suerte!
fuente
Esto me llevó un tiempo darme cuenta. En pocas palabras, la tabla que hace referencia a la otra tabla ya tiene datos y uno o más de sus valores no existen en la tabla principal.
por ejemplo, Table2 tiene los siguientes datos:
Tabla 1
Si intenta ALTERAR table2 y agrega una clave foránea, la consulta fallará porque UserID = 5 no existe en Table1.
fuente
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 truncar la tabla 1 y volver a establecer el valor de incremento automático en 1. Luego puede agregar la tabla 2.
fuente
Asegúrese de haber configurado el motor de base de datos en InnoDB porque en MyISAM la clave externa y la transacción no son compatibles
fuente
Solo una pequeña solución: haga que JoinColumn 'nullable = true' en Table1 y el campo 'UserID' 'insertable = false' y 'nullable = true' en Table2.
En la entidad Table1:
En la entidad Table2:
fuente
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 primaria.
compruebe bien, porque InnoDB tiene el error que a veces aumenta la columna auto_increment sin agregar valores, por ejemplo,
INSERT ... ON DUPLICATE KEY
fuente
Tuve un problema similar. Está intentando aplicar una clave foránea en una tabla que tiene contenido y la columna no es anulable. Tienes dos opciones.
fuente
Asegúrese de que el valor que está insertando en la clave externa exista en la tabla primaria. Eso me ayudo. Por ejemplo, si inserta
user_id = 2
entable.2
, perotable.1
no tiene unuser_id = 2
, entonces la restricción arrojará un error. El mío fue el código de error # 1452 para ser exactos. ¡Espero que esto ayude a alguien más con el mismo problema!fuente
Tuve el mismo problema, y la razón fue que tuve una fila en la primera tabla antes de agregar la clave foránea.
fuente
También enfrenté el mismo problema y el problema era que el valor de las entradas de la tabla principal no coincidía con el valor de la tabla de clave externa. Así que por favor intente después de borrar todas las filas ...
fuente
En caso de que las soluciones proporcionadas por otros no funcionen. Entonces debería intentar verificar los motores de base de datos de las tablas principal y secundaria. En mi caso, tenía el motor de las tablas principales configurado en "MyISAM", cambiándolo a InnoDB.
Espero que esto ayude a otros que están atrapados como yo.
fuente
No debe colocar un campo ondelete contra una cascada en la base de datos.
Establezca el campo onDelete en RESTRICT
Buena suerte ♥
fuente
Otro caso extraño que me dio este error. Había hecho referencia errónea a mis claves foráneas a la clave primaria id. Esto fue causado por comandos incorrectos de alterar tabla. Descubrí esto al consultar la tabla INFORMATION_SCHEMA (Ver esta respuesta de stackoverflow)
La tabla estaba tan confundida que no podía ser reparada por ningún comando ALTER TABLE . Finalmente dejé caer la mesa y la reconstruí. Esto eliminó la integridadError.
fuente
Tal vez mientras agrega la
userID
columna, hay datos para esa determinada tabla que está establecida, por lo que tendrá un valor predeterminado de0
, intente agregar la columna sin elNOT NULL
fuente
También recibí este error: "No se puede agregar o actualizar una fila secundaria: falla una restricción de clave externa". Recibí el error al agregar una nueva fila a la tabla primaria
El problema era que la restricción de clave externa se había definido en la tabla primaria en lugar de la tabla secundaria.
fuente
Si usa el índice mysql o la relación entre tablas, primero elimina las columnas (por ejemplo: city_id) y crea nuevas columnas con el mismo nombre (por ejemplo: city_id). Luego intente nuevamente ...
fuente
¿Hay algún dato existente que contenga la tabla? Si es así, intente borrar todos los datos en la tabla que desea agregar una clave foránea. Luego, ejecute el código (agregue una clave foránea) nuevamente.
Encontré este problema muchas veces. Esta eliminación de todos los datos de la tabla funciona cuando desea agregar una clave externa en una tabla existente.
Espero que esto funcione :)
fuente
Eliminar índices del campo ID de usuario de table2. Sus trajes para mi
fuente
Este problema puede surgir debido a la siguiente razón:
Si lo está haciendo en Spring mvc, debe describir explícitamente el tipo de identificación, porque a veces mysql no reconoce el tipo de identificación. así que estableces explícitamente como en ambas tablas en tu clase de entidad
@GeneratedValue (strategy = GenerationType.IDENTITY)
fuente