2014-10-02 93 views
-1

我收到以下错误不知道是什么问题mysql的错误 - 不能删除或更新父行,外键约束失败

Microsoft OLE DB提供程序的ODBC驱动程序错误“80004005”

[MySQL的] [ODBC驱动程序3.51]的[mysqld-5.5.32-31.0日志]无法删除或更新父行:外键约束失败 (DatabasenameFADLSongs,约束FK_FADLSongs_OrderID FOREIGN KEY(OrderID)参考OrdersOrderID)ON DELETE NO行动 UPDATE NO ACTION)

查询其投掷错误是

DELETE FROM Orders WHERE OrderID Not In (SELECT Distinct OrderID FROM MOrder) And 
OrderID Not In (SELECT Distinct OrderID FROM PSGOrder) 

我的表结构如下:

CREATE TABLE IF NOT EXISTS `MOrder` (
    `MOrderID` int(11) NOT NULL AUTO_INCREMENT, 
    `MediaID` int(11) NOT NULL, 
    `OrderID` int(11) NOT NULL, 
    `MediaOption` tinyint(4) DEFAULT NULL, 
    `UnitCost` double NOT NULL, 
    `Quantity` int(11) NOT NULL, 
    `BonusDeduction` double DEFAULT NULL, 
    `MediaOptions` varchar(25) DEFAULT NULL, 
    PRIMARY KEY (`MOrderID`), 
    KEY `MediaID` (`MediaID`), 
    KEY `OrderID` (`OrderID`), 
    CONSTRAINT `FK_MOrder_MediaID` FOREIGN KEY (`MediaID`) REFERENCES `Media` (`MediaID`) ON DELETE NO ACTION ON UPDATE CASCADE, 
    CONSTRAINT `FK_MOrder_OrderID` FOREIGN KEY (`OrderID`) REFERENCES `Orders` (`OrderID`) ON DELETE NO ACTION ON UPDATE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE IF NOT EXISTS `Orders` (
    `OrderID` int(11) NOT NULL AUTO_INCREMENT, 
    `UserID` int(11) NOT NULL, 
    `PNMType` varchar(1) DEFAULT NULL, 
    `PNMDeliveryOption` varchar(1) DEFAULT NULL, 
    `PNMQuantity` smallint(5) unsigned DEFAULT NULL, 
    `PNMSongCost` double DEFAULT NULL, 
    `PNMDiscLabel` varchar(50) DEFAULT NULL, 
    `ShippingCost` double DEFAULT NULL, 
    PRIMARY KEY (`OrderID`), 
    KEY `IDX_Orders_CouponNo` (`CouponNo`), 
    KEY `IDX_Orders_VoucherNo` (`VoucherNo`), 
    KEY `OrderStatusID` (`OrderStatusID`), 
    KEY `UserID` (`UserID`), 
    CONSTRAINT `FK_Orders_CouponNo` FOREIGN KEY (`CouponNo`) REFERENCES `Coupons` (`CouponNo`) ON DELETE NO ACTION ON UPDATE CASCADE, 
    CONSTRAINT `FK_Orders_OrderStatusID` FOREIGN KEY (`OrderStatusID`) REFERENCES `OrderStatus_LU` (`OrderStatusID`) ON DELETE NO ACTION ON UPDATE CASCADE, 
    CONSTRAINT `FK_Orders_UserID` FOREIGN KEY (`UserID`) REFERENCES `Users` (`UserID`) ON DELETE NO ACTION ON UPDATE CASCADE, 
    CONSTRAINT `FK_Orders_VoucherNo` FOREIGN KEY (`VoucherNo`) REFERENCES `Vouchers` (`VoucherNo`) ON DELETE NO ACTION ON UPDATE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 


CREATE TABLE IF NOT EXISTS `PSGOrder` (
    `PSGOrderID` int(11) NOT NULL AUTO_INCREMENT, 
    `OrderID` int(11) NOT NULL, 
    `SongID` int(11) NOT NULL, 
    `DateDownloaded` datetime DEFAULT NULL, 
    PRIMARY KEY (`PSGOrderID`), 
    KEY `IDX_PSGOrder_OrderID` (`OrderID`), 
    KEY `IDX_PSGOrder_SongID` (`SongID`), 
    CONSTRAINT `FK_PSGOrder_OrderID` FOREIGN KEY (`OrderID`) REFERENCES `Orders` (`OrderID`) ON DELETE NO ACTION ON UPDATE NO ACTION, 
    CONSTRAINT `FK_PSGOrder_SongID` FOREIGN KEY (`SongID`) REFERENCES `Songs` (`SongID`) ON DELETE NO ACTION ON UPDATE NO ACTION 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE IF NOT EXISTS `FADLSongs` (
    `FADLSongID` int(11) NOT NULL AUTO_INCREMENT, 
    `OrderID` int(11) NOT NULL, 
    `SongID` int(11) NOT NULL, 
    `DateDownloaded` datetime NOT NULL, 
    PRIMARY KEY (`FADLSongID`), 
    KEY `IDX_FADLSongs_OrderID` (`OrderID`), 
    KEY `IDX_FADLSongs_SongID` (`SongID`), 
    CONSTRAINT `FK_FADLSongs_OrderID` FOREIGN KEY (`OrderID`) REFERENCES `Orders` (`OrderID`) ON DELETE NO ACTION ON UPDATE NO ACTION, 
    CONSTRAINT `FK_FADLSongs_SongID` FOREIGN KEY (`SongID`) REFERENCES `Songs` (`SongID`) ON DELETE NO ACTION ON UPDATE NO ACTION 
) ENGINE=InnoDB AUTO_INCREMENT=1768 DEFAULT CHARSET=utf8; 
+2

哪里是 “FADLSongs”?在这里有一个对“订单”的引用,它不会让它删除。在那里检查。 – brian 2014-10-02 06:30:21

+0

FADLSongs是其中的OrderID和songid字段链接 – user580950 2014-10-02 06:37:44

+0

@eBrian我加入FADLSongs表 – user580950 2014-10-02 06:40:47

回答

2

以及

看看这里以及

Deleting from a MySQL table with foreign key constraints

,你可以设置foreign key constraints0和可更新/删除的行,然后折戟foreign key constraints

SET foreign_key_checks = 0 
    DELETE FROM Orders WHERE OrderID Not In (SELECT Distinct OrderID FROM MOrder) And OrderID Not In (SELECT Distinct OrderID FROM PSGOrder) 
SET foreign_key_checks = 1 
相关问题