MySQL contrainte de clé Étrangère - Erreur 1452 - Impossible d'ajouter ou de mettre à jour ligne enfant
J'ai utilisé d'autres posts sur ce sujet, mais je vais avoir pas de chance.
Voici le code que j'execute:
UPDATE tblOrderItems SET `ItemID` = 0004 WHERE `OrderNum`= 203 AND `OrderItemID` = 26
Voici mon erreur:
Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails (`cai0066`.`tblOrderItems`, CONSTRAINT `ItemID` FOREIGN KEY (`ItemID`) REFERENCES `tblCatalogItems` (`ItemID`))
Notes:
- Il se passe quand je l'ai
INSERT
ouUPDATE
entblOrderItems
. tblCatalogItems
ne ont unItemID
de0004
. Voir: cette
Voici les instructions de création généré par MySQL Workbench:
delimiter $$
CREATE TABLE `tblCatalogItems` (
`ItemID` varchar(10) NOT NULL DEFAULT '',
`ItemName` varchar(50) DEFAULT NULL,
`Wholesale` decimal(10,2) DEFAULT NULL,
`Cost5-10` decimal(10,2) DEFAULT NULL,
`Cost11-19` decimal(10,2) DEFAULT NULL,
`Cost20` decimal(10,2) DEFAULT NULL,
`Retail` decimal(10,2) DEFAULT NULL,
PRIMARY KEY (`ItemID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1$$
delimiter $$
CREATE TABLE `tblItemCosts` (
`Cost` decimal(10,2) DEFAULT NULL,
`VendorID` int(11) NOT NULL,
`ItemID` varchar(10) NOT NULL,
KEY `VendorID_idx` (`VendorID`),
KEY `ItemID_idx` (`ItemID`),
CONSTRAINT `VendorID` FOREIGN KEY (`VendorID`) REFERENCES `tblVendors` (`VendorID`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=latin1$$
delimiter $$
CREATE TABLE `tblOrderItems` (
`OrderItemID` int(11) NOT NULL AUTO_INCREMENT,
`OrderNum` int(11) NOT NULL,
`PayPalTxnID` int(10) DEFAULT NULL,
`Description` varchar(225) DEFAULT NULL,
`Quantity` int(11) DEFAULT NULL,
`UnitPrice` decimal(10,2) DEFAULT NULL,
`ItemStatus` varchar(30) DEFAULT NULL,
`TrackingNumber` varchar(50) DEFAULT NULL,
`ShippingCost` decimal(10,2) DEFAULT NULL,
`ItemID` varchar(50) DEFAULT NULL,
`TotalPrice` decimal(10,2) DEFAULT NULL,
PRIMARY KEY (`OrderItemID`,`OrderNum`),
UNIQUE KEY `PayPalTxnID_UNIQUE` (`PayPalTxnID`),
KEY `PayPalTxnID_idx` (`PayPalTxnID`),
KEY `UnitPrice_idx` (`ItemID`),
KEY `OrderNum_idx` (`OrderNum`),
CONSTRAINT `ItemID` FOREIGN KEY (`ItemID`) REFERENCES `tblCatalogItems` (`ItemID`),
CONSTRAINT `OrderNum` FOREIGN KEY (`OrderNum`) REFERENCES `tblOrders` (`OrderNum`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `UnitPrice` FOREIGN KEY (`ItemID`) REFERENCES `tblCatalogItems` (`ItemID`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=7678 DEFAULT CHARSET=latin1$$
delimiter $$
CREATE TABLE `tblOrderItemStatus` (
`OrderItemID` int(11) NOT NULL,
`OrderDate` varchar(12) DEFAULT NULL,
`DesignProofSent` varchar(12) DEFAULT NULL,
`SubmittedToProduction` varchar(12) DEFAULT NULL,
`InProduction` varchar(12) DEFAULT NULL,
`Shipped` varchar(12) DEFAULT NULL,
PRIMARY KEY (`OrderItemID`),
UNIQUE KEY `OrderItemID_UNIQUE` (`OrderItemID`),
KEY `OrderItemID_idx` (`OrderItemID`),
CONSTRAINT `OrderItemID` FOREIGN KEY (`OrderItemID`) REFERENCES `tblOrderItems` (`OrderItemID`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=latin1$$
delimiter $$
CREATE TABLE `tblOrders` (
`OrderNum` int(11) NOT NULL AUTO_INCREMENT,
`PayPalTxnID` int(10) DEFAULT NULL,
`OrderDate` varchar(50) DEFAULT NULL,
`OrderStatus` varchar(10) DEFAULT 'New',
`RushFlag` bit(1) DEFAULT b'0',
`ShipName` varchar(50) DEFAULT NULL,
`ShipEmail` varchar(100) DEFAULT NULL,
`ShipAddress1` varchar(50) DEFAULT NULL,
`ShipAddress2` varchar(50) DEFAULT NULL,
`ShipCity` varchar(50) DEFAULT NULL,
`ShipState` char(2) DEFAULT NULL,
`ShipZip` varchar(10) DEFAULT NULL,
`ShippingCharge` decimal(10,2) DEFAULT NULL,
`TotalCost` decimal(10,2) DEFAULT NULL,
PRIMARY KEY (`OrderNum`),
UNIQUE KEY `PayPalTxnID_UNIQUE` (`PayPalTxnID`)
) ENGINE=InnoDB AUTO_INCREMENT=346 DEFAULT CHARSET=latin1$$
delimiter $$
CREATE TABLE `tblVendors` (
`VendorID` int(11) NOT NULL,
`VendorName` varchar(50) DEFAULT NULL,
PRIMARY KEY (`VendorID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1$$
J'ai essayé la suggestion dans cette pertinent, mais il n'y avait pas de résultats. C'est une nouvelle base de données n'a pas été effectivement utilisés; mais je viens de remplir avec des données fausses. Toutes les idées seraient grandement appréciés.
Avez-vous essayé de faire la
Je vais modifier mon post pour y inclure ceci: Il arrive quand je l'ai
Vous avez
C'est tout le problème. Je ne peux pas le croire. Je vous remercie.
UPDATE
sur tblCatalogItems
?Je vais modifier mon post pour y inclure ceci: Il arrive quand je l'ai
INSERT
ou UPDATE
en tblOrderItems
. Je ne veux pas créer de nouveaux articles du catalogue, j'ai envie de tirer les éléments du catalogue et dans les ordres. J'espère que efface certaines choses.Vous avez
SET ItemID = 0004
mais ItemID
est de type varchar. Essayez SET ItemID = '0004'
, si un tel élément existe dans la table parent.C'est tout le problème. Je ne peux pas le croire. Je vous remercie.
OriginalL'auteur Calvin | 2013-01-08
Vous devez vous connecter pour publier un commentaire.
Il y a une contrainte de clé étrangère sur
tblOrderItems
que sonItemID
doit faire référence à unItemID
qui existe déjà danstblCatalogItems
.Le message signifie seulement que vous essayez de mettre à jour
tblOrderItems
à la référence de l'élément danstblCatalogItems
avecItemID
= 0004, mais cet élément n'existe pas.Depuis
ItemID
est un varchar, vous voulez probablement pour citer le0004
ou il peut être converti en int4
avant la conversion de type varchar. C'est peut-être votre problème si la ligne avecItemID
= 0004 existe réellement.ItemID
s ont des caractères en eux, donc je vais juste avoir à les citer tous. Merci encore!OriginalL'auteur Joachim Isaksson
Sans voir les données de la table, je ne peux pas être sûr, mais je suppose que c'est parce qu'il n'y a pas d'enregistrement dans
tblCatalogItems
avec unItemID
de '0004'.Aussi, vous avez probablement besoin de citer les
0004
dans votre instruction de mise à jour depuis la colonne est définie comme personnage (varchar(10)
) pas de numéro (int
).Il y a une clé étrangère de la relation définie entre
tblCatalogItems.ItemId
ettblOrderItems.ItemId
ce qui signifie que toutes les lignes detblOrderItems
ne peut avoir une valeur pourItemId
qui correspond à uneItemId
trouvé danstblCatalogItems
.Vous avez par conséquent besoin d'insérer un enregistrement dans 'tblCatalogItems' avec un
ItemId
de '0004' abord, avant d'exécuter la mise à jour surtblOrderItems
Sinon, vous devez modifier le
SET ItemID =
clause dans votre mise à jour pour définir une valeur qui correspond à uneItemId
valeur qui existe réellement dans letblCatalogItems
tableOriginalL'auteur Chamila Chulatunga
Le type de données doit correspondre sur les deux côtés de votre contrainte de clé étrangère. Ici, vous avez un
varchar(50)
se référant à unvarchar(10)
, qui n'est pas autorisé.OriginalL'auteur troelskn