3

このトピックに関する他の投稿を使用しましたが、うまくいきません。

実行するコードは次のとおりです。

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. INSERT私がま​​たはUPDATEに入るときに起こりtblOrderItemsます。
  2. tblCatalogItems ItemIDあり0004ます。参照:これ

MySQL Workbench によって生成される create ステートメントは次のとおりです。

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

この関連する投稿で提案を試みましたが、結果はありませんでした。これは、実際にはまだ使用されていない新しいデータベースです。偽のデータで埋めただけです。どんなアイデアでも大歓迎です。

4

3 に答える 3

6

に既に存在するを参照する必要tblOrderItemsあるという外部キー制約があります。ItemIDItemIDtblCatalogItems

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

このメッセージは、 = 0004tblOrderItemsのアイテムを参照するように更新しようとしているが、そのアイテムが存在しないことを意味するだけです。tblCatalogItemsItemID

は varchar であるためItemID、おそらく をクォートする0004か、4varchar に変換する前に int に変換する必要があります。ItemID= 0004 の行が実際に存在する場合、それが問題になる可能性があります。

UPDATE tblOrderItems SET `ItemID` = '0004' WHERE `OrderNum`= 203 AND `OrderItemID` = 26
于 2013-01-08T19:58:48.460 に答える
0

テーブルのデータを見ないとわかりませんが、「0004」のレコードがないためだと思いtblCatalogItemsますItemID

また、列は数値()ではなく0004文字()として定義されているため、updateステートメントでおそらく引用符で囲む必要があります。varchar(10)int

tblCatalogItems.ItemIdとの間に定義された外部キー関係がありますtblOrderItems.ItemId。つまり、の行は、で見つかったものと一致するtblOrderItems値のみを持つことができます。ItemIdItemIdtblCatalogItems

したがってItemId、更新を実行する前に、最初に「0004」のレコードを「tblCatalogItems」に挿入する必要があります。tblOrderItems

または、更新の句を変更して、テーブルに実際に存在する値SET ItemID =と一致する値を設定する必要がありますItemIdtblCatalogItems

于 2013-01-08T20:00:04.353 に答える
0

データ型は、外部キー制約の両側で一致する必要があります。ここにvarchar(50)参照 aがありますが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$$
于 2013-01-08T20:06:21.427 に答える