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
, CONSTRAINTOrdrelinje_fk
FOREIGN KEY (Ordre
) RÉFÉRENCESOrdre
(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?
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
.
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.
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
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;
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.
null
.Une fois les données corrigées, nous pouvons appliquer la contrainte de clé étrangère en utilisant la syntaxe ALTER TABLE
.
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
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.
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.
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
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.
vous devez ajouter les données de REFERENCES KEY de PRIMARY TABLE à FOREIGN KEY dans CHILD TABLE.