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

131

He creado tablas en MySQL Workbench como se muestra a continuación:

Tabla ORDRE:

CREATE TABLE Ordre (
  OrdreID   INT NOT NULL,
  OrdreDato DATE DEFAULT NULL,
  KundeID   INT  DEFAULT NULL,
  CONSTRAINT Ordre_pk PRIMARY KEY (OrdreID),
  CONSTRAINT Ordre_fk FOREIGN KEY (KundeID) REFERENCES Kunde (KundeID)
)
  ENGINE = InnoDB;

Tabla PRODUKT:

CREATE TABLE Produkt (
  ProduktID          INT NOT NULL,
  ProduktBeskrivelse VARCHAR(100) DEFAULT NULL,
  ProduktFarge       VARCHAR(20)  DEFAULT NULL,
  Enhetpris          INT          DEFAULT NULL,
  CONSTRAINT Produkt_pk PRIMARY KEY (ProduktID)
)
  ENGINE = InnoDB;

y tabla ORDRELINJE:

CREATE TABLE Ordrelinje (
  Ordre         INT NOT NULL,
  Produkt       INT NOT NULL,
  AntallBestilt INT DEFAULT NULL,
  CONSTRAINT Ordrelinje_pk PRIMARY KEY (Ordre, Produkt),
  CONSTRAINT Ordrelinje_fk FOREIGN KEY (Ordre) REFERENCES Ordre (OrdreID),
  CONSTRAINT Ordrelinje_fk1 FOREIGN KEY (Produkt) REFERENCES Produkt (ProduktID)
)
  ENGINE = InnoDB;

así que cuando trato de insertar valores en la ORDRELINJEtabla obtengo:

Código de error: 1452. No se puede agregar o actualizar una fila secundaria: falla una restricción de clave externa ( srdjank. Ordrelinje, REFERENCIAS Ordrelinje_fkDE LLAVE EXTRANJERA DE RESTRICCIÓN ( Ordre)Ordre ( OrdreID))

He visto las otras publicaciones sobre este tema, pero no tuve suerte. ¿Estoy supervisando algo o alguna idea de qué hacer?

usuario3289677
fuente

Respuestas:

172

Tomado del uso de restricciones de CLAVE EXTRANJERA

Las relaciones de clave externa implican una tabla primaria que contiene los valores de datos centrales y una tabla secundaria con valores idénticos que apuntan a su padre. La cláusula FOREIGN KEY se especifica en la tabla secundaria.

Rechazará cualquier operación INSERT o UPDATE que intente crear un valor de clave foránea en una tabla secundaria si no hay un valor de clave candidata coincidente en la tabla primaria.

Por lo tanto, su error Error Code: 1452. Cannot add or update a child row: a foreign key constraint failsesencialmente significa que está intentando agregar una fila a su Ordrelinjetabla para la cual no hay una fila coincidente (OrderID) en la Ordretabla.

Primero debe insertar la fila en su Ordretabla.

Rahul
fuente
¿O podemos soltar la clave externa y luego agregar clave externa después de la inserción de datos?
Vamsi Pavan Mahesh
@VamsiPavanMahesh, NO, porque incluso si haces eso; la creación de su clave anterior fallará con el mismo tipo de error, ya que habrá una falta de coincidencia de datos clave.
Rahul
44
Simplemente hablando si los niños tienen identificaciones de padres definidas, estos padres tienen que existir. Y pensé que mi sintaxis estaba equivocada ... Me ayudó mucho. ¡Gracias!
wst
2
¿Qué pasa con las relaciones opcionales?
Hamed Hamedi
40

Está obteniendo esta verificación de restricción porque la Ordretabla no tiene referencia OrdreIDproporcionada en el comando de inserción.

Para insertar valor en Ordrelinje , primero debe ingresar el valor en la Ordretabla y usarlo OrdreIDenOrderlinje tabla.

O puede eliminar la restricción no nula e insertar un valor NULL en ella.

Ankit Bansal
fuente
29

Debe eliminar los datos de la tabla secundaria que no tengan ningún valor de clave externa correspondiente a la clave primaria de la tabla primaria. O bien, elimine todos los datos de la tabla secundaria e inserte nuevos datos que tengan el mismo valor de clave externa que la clave primaria en la tabla primaria. . Eso debería funcionar . Aquí también un video de youtube

Humphrey
fuente
1
Esto es correcto, antes de insertar datos en la tabla dinámica (que tiene restricciones CASCADE), debe insertar datos en las tablas primarias. por ejemplo, primera tabla - permisos; 2da tabla - roles; 3.a tabla: permiso_role; Así que primero inserte en la tabla de permisos, segundo inserte en la tabla de roles y finalmente inserte en la tabla permission_role.
Deepak Panwar
24

El problema es con la restricción de CLAVE EXTRANJERA. Por defecto (SET FOREIGN_KEY_CHECKS = 1). La opción FOREIGN_KEY_CHECKS especifica si se comprueban o no las restricciones de clave externa para las tablas InnoDB. MySQL - SET FOREIGN_KEY_CHECKS

Podemos configurar la verificación de clave externa como deshabilitada antes de ejecutar la consulta. Deshabilitar clave externa .

Ejecute una de estas líneas antes de ejecutar su consulta, luego puede ejecutar su consulta con éxito. :)

1) Para sesión (recomendado)

SET FOREIGN_KEY_CHECKS=0;

2) a nivel mundial

SET GLOBAL FOREIGN_KEY_CHECKS=0;
Mr-Faizan
fuente
19

Este error generalmente ocurre porque tenemos algunos valores en el campo de referencia de la tabla secundaria, que no existen en el candidato / referenciado campo de la tabla primaria.

A veces, podemos obtener este error cuando estamos aplicando restricciones de clave externa a las tablas existentes, que ya tienen datos en ellas . Algunas de las otras respuestas sugieren eliminar los datos completamente de la tabla secundaria y luego aplicar la restricción. Sin embargo, esta no es una opción cuando ya tenemos datos de trabajo / producción en la tabla secundaria. En la mayoría de los escenarios, necesitaremos actualizar los datos en la tabla secundaria (en lugar de eliminarlos).

Ahora, podemos utilizar Left Joinpara encontrar todas esas filas en la tabla secundaria, que no tiene valores coincidentes en la tabla primaria. La siguiente consulta sería útil para obtener esas filas no coincidentes:

SELECT child_table.* 
FROM child_table 
LEFT JOIN parent_table 
  ON parent_table.referenced_column = child_table.referencing_column 
WHERE parent_table.referenced_column IS NULL

Ahora, generalmente puede hacer uno (o más) de los siguientes pasos para corregir los datos.

  1. Según su "lógica empresarial", deberá actualizar / hacer coincidir estos valores inigualables con los valores existentes en la tabla principal. Es posible que a veces necesite configurarlosnull también.
  2. Eliminar estas filas que tienen valores incomparables.
  3. Agregue nuevas filas en su tabla principal, correspondientes a los valores que no coinciden en la tabla secundaria.

Una vez que los datos están corregidos, podemos aplicar la restricción de clave externa utilizando la ALTER TABLEsintaxis.

Madhur Bhaiya
fuente
Elimino todos los datos de la tabla y luego agrego la clave externa que se ha agregado gracias
Sumit Kumar Gupta
4

en la tabla de clave externa tiene un valor que no pertenece a la tabla de clave primaria que estará relacionado, por lo que primero debe eliminar todos los datos / ajustar el valor de su tabla de clave externa de acuerdo con el valor que está en su clave primaria

Arbahud Rio Daroyni
fuente
3

Estaba teniendo este problema a pesar de que mi tabla principal tenía todos los valores a los que hacía referencia en mi tabla secundaria. El problema parecía ser que no podía agregar múltiples referencias secundarias a una sola clave externa. En otras palabras, si tenía cinco filas de datos referenciadas a la misma clave foránea, MySQL solo me permitía cargar la primera fila y me daba el error 1452.

Lo que funcionó para mí fue escribir el código "SET GLOBAL FOREIGN_KEY_CHECKS = 0". Después de eso, cerré MySQL y luego lo reinicié y pude cargar todos mis datos sin errores. Luego escribí "SET GLOBAL FOREIGN_KEY_CHECKS = 1" para restablecer el sistema a la normalidad, aunque no estoy completamente seguro de lo que hace FOREIGN_KEY_CHECKS. ¡Espero que esto ayude!

Matt Mcketty
fuente
¿No es esto lo que ya se sugirió en la respuesta publicada por @ Mr-Faizan? Si no, entonces explique lo que agrega su respuesta.
Adrian Mole
2

Esto se puede solucionar insertando los registros respectivos en la tabla principal primero y luego podemos insertar registros en la columna respectiva de la tabla secundaria. Compruebe también el tipo de datos y el tamaño de la columna. Debe ser igual a la columna de la tabla principal, incluso el motor y la clasificación también deben ser iguales. ¡PRUEBA ESTO! Así es como resolví el mío. Corrígeme si me equivoco.

frz
fuente
1

Su ORDRELINJEtabla está vinculada con la ORDERtabla utilizando una restricción de clave externa constraint Ordrelinje_fk foreign key(Ordre) references Ordre(OrdreID)según la Ordre int NOT NULL,columna de la tabla que ORDRELINJEdebe coincidir con cualquier Ordre int NOT NULL,columna de la ORDERtabla.

Ahora, lo que está sucediendo aquí es que, cuando está insertando una nueva fila en la ORDRELINJEtabla, de acuerdo con la restricción fk Ordrelinje_fk, está verificando la ORDERtabla siOrdreID está presente o no y, dado que no coincide con ningún OrderId, el compilador se queja de una violación de clave externa. Esta es la razón por la que recibe este error.

La clave externa es la clave principal de la otra tabla que utiliza en cualquier tabla para vincular entre ambas. Esta clave está vinculada por la restricción de clave externa que especifica al crear la tabla. Cualquier operación en los datos no debe violar esta restricción. La violación de esta restricción puede provocar errores como este.

Espero haberlo dejado claro.

Saket Choubey
fuente
1

Al insertar los valores de atributo de clave externa, primero verifique el tipo de atributo, así como el valor de atributo de clave principal en la relación principal, si los valores en la relación principal coinciden, entonces puede insertar / actualizar fácilmente los valores de atributo secundario.

ashok
fuente
1

debe agregar datos de la CLAVE DE REFERENCIAS en la TABLA PRIMARIA a la CLAVE EXTRANJERA en la TABLA DE NIÑOS,
esto significa que no debe agregar datos aleatorios a la clave externa ، solo use los datos de la clave primaria que sea accesible

descripción de datos en clave foránea

mamal
fuente
1

Esto me ayudó después de leer las respuestas de @ Mr-Faizan y otras.

Desmarca la casilla "Habilitar comprobaciones de clave externa"

en phpMyAdmin y presione la consulta. No sé acerca de WorkBench, pero las otras respuestas pueden ayudarte.

Sagar Wankhede
fuente
0

debe insertar al menos una materia prima en cada tabla (las que desea que apunten las claves foráneas) y luego puede insertar o actualizar los valores de las claves foráneas

Harvester Haidar
fuente
0

voy a exprimir esto aquí: mi caso estaba tratando de crear un me gusta para una publicación que no existe; al comprometerse con la base de datos, se produjo el error. La solución fue crear primero la publicación y luego darle me gusta. desde mi punto de vista, si post_id se iba a guardar en la tabla de me gusta, primero tenía que verificar con la tabla de publicaciones para determinar la existencia. me pareció mejor tenerlo de esta manera ya que es más lógico para mí de esa manera ...

Pytbyte
fuente
0

Cuando usa una clave externa , su orden de columnas debe ser el mismo para la inserción .

Por ejemplo, si va a añadir (userid, password)en la tabla 1 de la Tabla 2 a continuación, a partir tabla2 orden debe ser el mismo (userid, password)y no como (password,userid) donde userides clave externa en la Tabla 2 de la tabla 1 .

Kishan Solanki
fuente
0

El problema se produce porque establece la clave externa en la tabla secundaria después de insertar algunos datos en la tabla secundaria.

Intente eliminar todos los datos de la tabla secundaria, luego configure la clave externa y luego agregue / inserte los datos en la tabla, funcionará.

Khalid Teli
fuente
0

verifica el no. de registro en la tabla primaria que coincide con la tabla secundaria y también la clave primaria debe coincidir con la referencia de clave externa. Esto funciona para mi.

Upkar
fuente
-4

Está 100% funcionando ...

ERROR 1452: no se puede agregar o actualizar una fila secundaria: falla una restricción de clave externa ... si se produce este tipo de error: en primer lugar, vaya a esta tabla y compruebe la configuración> si Motor es: InnoDB y luego cambie su a MyISAM

(y eliminar referencias restricciones externas)

kundan chauhan_KP
fuente