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;
donc quand j'essaye d'insérer des valeurs dans la ORDRELINJE
table j'obtiens:
Code d'erreur: 1452. Impossible d'ajouter ou de mettre à jour une ligne enfant: une contrainte de clé étrangère échoue (
srdjank
.Ordrelinje
, CONSTRAINTOrdrelinje_fk
FOREIGN KEY (Ordre
) REFERENCESOrdre
(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 dois faire?
mysql
sql
mariadb
mysql-error-1452
user3289677
la source
la source
Réponses:
Tiré de l' utilisation des contraintes FOREIGN KEY
Donc, votre erreur
Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails
signifie essentiellement que vous essayez d'ajouter une ligne à votreOrdrelinje
table pour laquelle aucune ligne correspondante (OrderID) n'est présente dans laOrdre
table.Vous devez d'abord insérer la ligne dans votre
Ordre
tableau.la source
Vous obtenez cette vérification de contrainte car la
Ordre
table n'a pas de référenceOrdreID
fournie dans la commande d'insertion.Pour insérer une valeur dans
Ordrelinje
, vous devez d'abord entrer la valeur dans leOrdre
tableau et l'utiliserOrdreID
dans leOrderlinje
tableau.Ou vous pouvez supprimer la contrainte non nulle et y insérer une valeur NULL.
la source
Vous devez supprimer les données de la table enfant qui n'ont pas de valeur de clé étrangère correspondante à la clé primaire de la table parent. Ou 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 dans la table parent . Cela devrait fonctionner . Ici aussi une vidéo youtube
la source
Le problème est lié à la contrainte FOREIGN KEY. Par défaut (SET FOREIGN_KEY_CHECKS = 1). L'option FOREIGN_KEY_CHECKS spécifie 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 la requête. Désactivez la clé étrangère .
Exécutez l'une de ces lignes avant d'exécuter votre requête, puis vous pouvez exécuter votre requête avec succès. :)
1) Pour la session (recommandé)
2) à l'échelle mondiale
la source
Cette erreur se produit généralement car nous avons des valeurs dans le champ de référence de la table enfant, qui n'existent pas dans le champ référencé / candidat de la table parent.
Parfois, nous pouvons obtenir cette erreur lorsque nous appliquons des contraintes de clé étrangère à des 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).
Maintenant, nous pouvons utiliser
Left Join
pour trouver toutes ces lignes dans la table enfant, qui n'a pas de valeurs correspondantes dans la table parent. La requête suivante serait utile pour récupérer ces lignes non correspondantes:Désormais, vous pouvez généralement effectuer une (ou plusieurs) des étapes suivantes pour corriger les données.
null
également.Une fois les données corrigées, nous pouvons appliquer la contrainte de clé étrangère à l'aide de la
ALTER TABLE
syntaxe.la source
dans la table de clé étrangère a une valeur qui n'appartient pas à 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
la source
J'avais ce problème même si ma table parent avait toutes les valeurs auxquelles je faisais référence dans ma table enfant. Le problème semblait être que je ne pouvais pas ajouter plusieurs références enfants à une seule clé étrangère. En d'autres termes, si j'avais cinq lignes de données référencées à la même clé étrangère, MySQL ne me permettait de télécharger que la première ligne et me donnait l'erreur 1452.
Ce qui a fonctionné pour moi a été de taper le code "SET GLOBAL FOREIGN_KEY_CHECKS = 0". Après cela, j'ai fermé MySQL, puis je l'ai redémarré et j'ai pu télécharger toutes mes données sans erreur. J'ai alors tapé "SET GLOBAL FOREIGN_KEY_CHECKS = 1" pour remettre le système à la normale bien que je ne sois pas entièrement sûr de ce que fait FOREIGN_KEY_CHECKS. J'espère que cela t'aides!
la source
Cela peut être résolu 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. Elle doit être identique à la colonne de la table parent, même le moteur et le classement doivent également être identiques. ESSAYE ÇA! C'est ainsi que j'ai résolu le mien. Corrigez-moi si je me trompe.
la source
Votre
ORDRELINJE
table est liée à uneORDER
table en utilisant une contrainte de clé étrangèreconstraint Ordrelinje_fk foreign key(Ordre) references Ordre(OrdreID)
selon quelleOrdre int NOT NULL,
colonne de tableORDRELINJE
doit correspondre à n'importe quelleOrdre int NOT NULL,
colonne deORDER
table.Maintenant, ce qui se passe ici, c'est que lorsque vous insérez une nouvelle ligne dans la
ORDRELINJE
table, selon la contrainte fk,Ordrelinje_fk
il vérifieORDER
si la tableOrdreID
est présente ou non et comme elle ne correspond à aucun OrderId, le compilateur se plaint de la violation de clé étrangère. 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 par 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 comme celle-ci.
J'espère que j'ai été clair.
la source
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.
la source
vous devez ajouter des données de REFERENCES KEY dans PRIMARY TABLE à FOREIGN KEY dans CHILD TABLE
cela signifie ne pas ajouter de données aléatoires à la clé étrangère ، utiliser simplement les données de la clé primaire qui sont accessibles
description des données dans la clé étrangère
la source
Cela m'a aidé après avoir lu @ Mr-Faizan et d'autres réponses.
dans phpMyAdmin et appuyez sur la requête. Je ne connais pas WorkBench mais les autres réponses pourraient vous aider.
la source
vous devez insérer au moins un raw dans chaque table (celles sur lesquelles vous voulez que les clés étrangères pointent) puis vous pouvez insérer ou mettre à jour les valeurs des clés étrangères
la source
mal insérez ceci ici: mon cas essayait de créer un semblable pour un poste qui à force d'exister; lors de la validation dans la base de données, l'erreur a été générée. La solution était de créer d'abord le message puis de l'aimer. d'après ce que j'ai compris, si le post_id devait être enregistré dans la table des likes, il fallait d'abord vérifier avec la table des messages pour vérifier l'existence. J'ai trouvé mieux de l'avoir de cette façon car c'est plus logique pour moi de cette façon.
la source
Lorsque vous utilisez une clé étrangère , l' ordre des colonnes doit être le même pour l' insertion .
Par exemple, si vous ajoutez
(userid, password)
à table1 de table2 puis de table2 ordre doit être la même(userid, password)
et pas comme(password,userid)
oùuserid
est la clé étrangère dans table2 de table1 .la source
Le problème se produit car vous définissez la clé étrangère dans la table enfant après avoir inséré des données dans la table enfant.
Essayez de supprimer toutes les données de la table enfant, puis définissez la clé étrangère et ensuite ajoutez / insérez les données dans la table, cela fonctionnera.
la source
vérifiez le non. de l'enregistrement dans la table parent qui correspond à la table enfant et également la clé primaire doit correspondre à la référence de clé étrangère. Cela fonctionne pour moi.
la source
Son fonctionnement à 100% ...
ERREUR 1452: Impossible d'ajouter ou de mettre à jour une ligne enfant: une contrainte de clé étrangère échoue .... si ce type d'erreur se produit: alors tout d'abord allez dans cette table et vérifiez le paramètre> si le moteur est: InnoDB puis changez-le en MyISAM
(et supprimer les références à la contrainte étrangère)
la source