web-dev-qa-db-fra.com

ERREUR 1452: Impossible d'ajouter ou de mettre à jour une ligne enfant: échec d'une contrainte de clé étrangère

J'ai créé des tables dans MySQL Workbench comme indiqué ci-dessous:

Tableau 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;

Table 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;

et table 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;

ainsi, lorsque j'essaie d'insérer des valeurs dans la table ORDRELINJE, je reçois:

Code d'erreur: 1452. Impossible d'ajouter ou de mettre à jour une ligne enfant: échec d'une contrainte de clé étrangère (srdjank.Ordrelinje, CONSTRAINT Ordrelinje_fk FOREIGN KEY (Ordre) RÉFÉRENCES Ordre (OrdreID)) 

J'ai vu les autres articles sur ce sujet, mais pas de chance. Est-ce que je supervise quelque chose ou une idée de ce que je vais faire? 

71
user3289677

Extrait de Utilisation des contraintes FOREIGN KEY

Les relations de clé étrangère impliquent une table parent qui contient le fichier valeurs de données centrales et une table enfant avec des valeurs identiques pointant retour à son parent. La clause FOREIGN KEY est spécifiée dans l'enfant table.

Il rejettera toute opération INSERT ou UPDATE qui tente de créer une valeur de clé étrangère dans une table enfant s'il n'y a pas de correspondance valeur de la clé candidate dans la table parente.

Votre erreur Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails signifie donc essentiellement que vous essayez d'ajouter une ligne à votre table Ordrelinje pour laquelle aucune ligne correspondante (OrderID) n'est présente dans la table Ordre.

Vous devez d'abord insérer la ligne dans votre table Ordre.

114
Rahul

Vous obtenez cette vérification de contrainte car la table ordre n'a pas d'identifiant d'ordre de référence fourni dans la commande insert.

Pour insérer une valeur dans ordrelinje, vous devez d’abord entrer la valeur dans la table ordre et utiliser le même ordreID dans la table orderlinje.

Ou vous pouvez supprimer la contrainte non nulle et y insérer une valeur NULL.

27
Ankit Bansal

Vous devez supprimer les données de la table enfant qui ne correspondent à aucune clé étrangère de la clé primaire de la table parent. Vous pouvez également supprimer toutes les données de la table enfant, puis insérer de nouvelles données ayant la même valeur de clé étrangère que la clé primaire de la table parent. . Cela devrait fonctionner 

9
Humphrey

Le problème est avec FOREIGN KEY Constraint. Par défaut (SET FOREIGN_KEY_CHECKS = 1). L'option FOREIGN_KEY_CHECKS indique s'il faut ou non vérifier les contraintes de clé étrangère pour les tables InnoDB. MySQL - SET FOREIGN_KEY_CHECKS

Nous pouvons définir la vérification de la clé étrangère comme désactivée avant d'exécuter Query. Désactiver la clé étrangère .

Exécutez l'une de ces lignes avant d'exécuter votre requête, vous pourrez alors l'exécuter avec succès. :)

1) Pour la session (recommandé)

SET FOREIGN_KEY_CHECKS=0;

2) globalement

SET GLOBAL FOREIGN_KEY_CHECKS=0;
6
Mr-Faizan

Cette erreur se produit généralement car nous avons dans le champ referencing de la table enfant des valeurs qui n'existent pas dans le champ référencé/candidat de la table parent.

Parfois, nous pouvons avoir cette erreur lorsque nous appliquons des contraintes de clé étrangère à une ou plusieurs tables existantes, contenant déjà des données . Certaines des autres réponses suggèrent de supprimer complètement les données de la table enfant, puis d'appliquer la contrainte. Cependant, ce n'est pas une option lorsque nous avons déjà des données de travail/production dans la table enfant. Dans la plupart des scénarios, nous devrons mettre à jour les données de la table enfant (au lieu de les supprimer).

Nous pouvons maintenant utiliser Left Join pour rechercher toutes les lignes de la table enfant, qui ne possèdent pas de valeurs correspondantes dans la table parent. La requête suivante (manquant dans les autres réponses) serait utile pour extraire les lignes qui ne correspondent pas: 

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

Désormais, vous pouvez généralement effectuer une (ou plusieurs) des étapes suivantes pour corriger les données.

  1. En fonction de votre "logique métier", vous devrez mettre à jour/faire correspondre ces valeurs incompatibles avec les valeurs existantes de la table parente. Vous pouvez parfois avoir besoin de les définir aussi null.
  2. Supprimer ces lignes ayant des valeurs incomparables.
  3. Ajoutez de nouvelles lignes dans votre table parent, correspondant aux valeurs incompatibles de la table enfant.

Une fois les données corrigées, nous pouvons appliquer la contrainte de clé étrangère en utilisant la syntaxe ALTER TABLE.

4
Madhur Bhaiya

dans la table de clé étrangère a une valeur qui n'est pas détenue dans la table de clé primaire qui sera liée, vous devez donc d'abord supprimer toutes les données/ajuster la valeur de votre table de clé étrangère en fonction de la valeur qui se trouve dans votre clé primaire

1
Arbahud Rio Daroyni

Lors de l'insertion des valeurs d'attribut de clé étrangère, vérifiez d'abord le type d'attribut, ainsi que la valeur d'attribut de clé primaire dans la relation parent. Si les valeurs de la relation parent correspondent, vous pouvez facilement insérer/mettre à jour les valeurs d'attribut enfant.

1
ashok

Cela peut être corrigé en insérant d’abord les enregistrements respectifs dans la table Parent, puis nous pouvons insérer des enregistrements dans la colonne respective de la table Child. Vérifiez également le type de données et la taille de la colonne. Il devrait être identique à la colonne de la table parent, même le moteur et le classement devraient également être identiques. ESSAYE ÇA! C'est comme ça que j'ai résolu le mien. Corrigez-moi si je me trompe.

1
frz

vous devez insérer au moins un brut dans chaque tableau (ceux sur lesquels vous souhaitez que les clés étrangères pointent), puis vous pouvez insérer ou mettre à jour les valeurs des clés étrangères 

0
Harvester Haidar

Votre table ORDRELINJE est liée à la table ORDER à l'aide d'une contrainte de clé étrangère constraint Ordrelinje_fk foreign key(Ordre) references Ordre(OrdreID), selon laquelle la colonne Ordre int NOT NULL, de la table ORDRELINJE doit correspondre à n'importe quelle colonne Ordre int NOT NULL, de la table ORDER

Maintenant, ce qui se passe est que, lorsque vous insérez une nouvelle ligne dans la table ORDRELINJE, conformément à la contrainte fk Ordrelinje_fk, elle vérifie la table ORDER si la OrdreID est présente ou non et comme elle ne correspond à aucun OrderId, le compilateur se plaint d'une clé étrangère. violation. C'est la raison pour laquelle vous obtenez cette erreur.

La clé étrangère est la clé primaire de l'autre table que vous utilisez dans n'importe quelle table pour établir un lien entre les deux. Cette clé est liée à la contrainte de clé étrangère que vous spécifiez lors de la création de la table. Toute opération sur les données ne doit pas violer cette contrainte. La violation de cette contrainte peut entraîner des erreurs de ce type.

J'espère que j'ai été clair.

0
Saket Choubey

vous devez ajouter les données de REFERENCES KEY de PRIMARY TABLE à FOREIGN KEY dans CHILD TABLE. 

description des données en clé étrangère

0
mamal