2013-01-08 49 views
3

我已经使用了关于此主题的其他帖子,但我没有运气。MySQL外键约束 - 错误1452 - 无法添加或更新子行

下面是我执行的代码:

UPDATE tblOrderItems SET `ItemID` = 0004 WHERE `OrderNum`= 203 AND `OrderItemID` = 26 

这里是我的错误:

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`)) 

注:

  1. 它发生时,我要么INSERTUPDATEtblOrderItems
  2. tblCatalogItems确实有一个ItemID0004。请参阅:this

这里是由MySQL工作台产生的创建语句:

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$$ 

我试着在this相关岗位的建议,但没有结果。这是一个尚未实际使用的新数据库;我刚刚填补了假数据。任何想法将不胜感激。

+0

您是否尝试过'tblCatalogItems'上的'UPDATE'? – Kermit

+0

我将编辑我的帖子以包含此:当我将'INSERT'或'UPDATE'添加到'tblOrderItems'时,就会发生这种情况。我不想创建新的目录项目,我想将目录中的项目拖入订单。我希望能澄清一些事情。 – Calvin

+0

你有'SET ItemID = 0004',但'ItemID'是varchar。如果这样的项目存在于父表中,请尝试'SET ItemID ='0004'。 –

回答

4

上有tblOrderItemsItemID需要引用已经存在于tblCatalogItemsItemID一个外键约束。

CONSTRAINT `ItemID` FOREIGN KEY (`ItemID`) REFERENCES `tblCatalogItems` (`ItemID`), 

的消息不仅意味着你要更新tblOrderItems来引用tblCatalogItemsItemID = 0004项目,但该项目不存在。

由于ItemID是一个varchar,你可能想引用0004,或者可以转换为varchar先转换成int 4。如果ItemID = 0004的行确实存在,那可能是您的问题。

UPDATE tblOrderItems SET `ItemID` = '0004' WHERE `OrderNum`= 203 AND `OrderItemID` = 26 
+0

我刚扔掉我的眼镜,因为我一整天都在忙着工作,这是一个类型问题。谢谢。一些'ItemID's中有字符,所以我只需要引用它们。再次感谢! – Calvin

0

没有看到表中的数据我不能肯定,但我猜这是因为在tblCatalogItems没有记录与“0004”的ItemID。由于列被定义为字符(varchar(10))而非数字(int),因此您可能需要在更新声明中引用0004

tblCatalogItems.ItemIdtblOrderItems.ItemId之间限定的外键关系,这意味着在任何tblOrderItems行只能有用于ItemIdtblCatalogItems发现了一个匹配ItemId的值。

因此,你需要插入一条记录到“tblCatalogItems”与“0004”的ItemId第一,在tblOrderItems

运行你的更新之前或者您需要更改SET ItemID =子句中的更新设置的值与tblCatalogItems表中实际存在的值ItemId相匹配

0

数据类型需要匹配外键约束的两侧。在这里你有一个varchar(50)指的是varchar(10),这是不允许的。

CREATE TABLE `tblCatalogItems` (
    `ItemID` varchar(10) NOT NULL DEFAULT '', 
    ... 
) ENGINE=InnoDB DEFAULT CHARSET=latin1$$ 

... 

CREATE TABLE `tblOrderItems` (
    `ItemID` varchar(50) DEFAULT NULL, 
    ... 
    CONSTRAINT `UnitPrice` FOREIGN KEY (`ItemID`) REFERENCES `tblCatalogItems` (`ItemID`) ON DELETE NO ACTION ON UPDATE NO ACTION 
) ENGINE=InnoDB AUTO_INCREMENT=7678 DEFAULT CHARSET=latin1$$ 
相关问题