2016-03-22 51 views
0

因此,我在MySQL中創建了以下表格。錯誤代碼:1215:無法添加外鍵約束

CREATE TABLE `StockTransaction` (
    `TransactionID` int(11), 
    `Fee` decimal(6,2), 
    `DateTime` datetime DEFAULT NULL, 
    `PricePerShare` decimal(6,2), 
    PRIMARY KEY (`TransactionID`) 
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 

# Dump of table StockOrder 
# ------------------------------------------------------------ 

DROP TABLE IF EXISTS `StockOrder`; 

CREATE TABLE `StockOrder` (
    `OrderID` int(11) NOT NULL, 
    `OrderStockSymbol` char(6) NOT NULL, 
    `OrderType` enum('buy','sell') DEFAULT NULL, 
    `NumOfShares` int(11) DEFAULT NULL, 
    `OrderCustomerAccNum` int(11) unsigned NOT NULL, 
    `DateOfOrder` datetime DEFAULT NULL, 
    `PriceType` enum('Market','MarketOnClose','TrailingStop','HiddenStop') NOT NULL, 
    `OrderEmployeeID` int(11) unsigned DEFAULT NULL, 
    `OrderCustomerID` int(11) unsigned NOT NULL, 
    `OrderTransactionID` int(11) unsigned, 
    `Type` char(30) NOT NULL DEFAULT 'Default', 
    PRIMARY KEY (`OrderID`,`Type`), 
    CONSTRAINT `stockorder_ibfk_1` FOREIGN KEY (`OrderStockSymbol`) REFERENCES `Stock` (`StockSymbol`) ON DELETE NO ACTION ON UPDATE CASCADE, 
    CONSTRAINT `stockorder_ibfk_2` FOREIGN KEY (`OrderCustomerAccNum`) REFERENCES `Account` (`AccountNumber`) ON DELETE NO ACTION ON UPDATE CASCADE, 
    CONSTRAINT `stockorder_ibfk_3` FOREIGN KEY (`OrderCustomerID`) REFERENCES `Customer` (`SSN`) ON DELETE NO ACTION ON UPDATE CASCADE, 
    CONSTRAINT `stockorder_ibfk_4` FOREIGN KEY (`OrderEmployeeID`) REFERENCES `Employee` (`EmployeeSSN`) ON DELETE NO ACTION ON UPDATE CASCADE, 
    CONSTRAINT `stockorder_ibfk_5` FOREIGN KEY (`OrderTransactionID`) REFERENCES `StockTransaction` (`TransactionID`) ON DELETE NO ACTION ON UPDATE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 

無論出於何種原因,如果我註釋掉約束「stockorder_ibfk_5」的創作,此代碼的工作,但對我的生活我想不出爲什麼。究竟發生了什麼,爲什麼我無法創建StockTransaction的外鍵。 TransactionID

回答

1

類型不匹配。 StockOrder.OrderTransactionID無符號StockTransaction.TransactionID簽署。讓它們都是有符號的或無符號的,並且你應該閃亮。

1

在創建外鍵和引用字段模式的字段應該完全相同,其中一個是有符號的(默認),另一個是無符號的。所以,你的架構應該是按照如下─

CREATE TABLE `StockTransaction` (
    `TransactionID` int(11) unsigned, 
    `Fee` decimal(6,2), 
    `DateTime` datetime DEFAULT NULL, 
    `PricePerShare` decimal(6,2), 
    PRIMARY KEY (`TransactionID`) 
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 

# Dump of table StockOrder 
# ------------------------------------------------------------ 

DROP TABLE IF EXISTS `StockOrder`; 

CREATE TABLE `StockOrder` (
    `OrderID` int(11) NOT NULL, 
    `OrderStockSymbol` char(6) NOT NULL, 
    `OrderType` enum('buy','sell') DEFAULT NULL, 
    `NumOfShares` int(11) DEFAULT NULL, 
    `OrderCustomerAccNum` int(11) unsigned NOT NULL, 
    `DateOfOrder` datetime DEFAULT NULL, 
    `PriceType` enum('Market','MarketOnClose','TrailingStop','HiddenStop') NOT NULL, 
    `OrderEmployeeID` int(11) unsigned DEFAULT NULL, 
    `OrderCustomerID` int(11) unsigned NOT NULL, 
    `OrderTransactionID` int(11) unsigned, 
    `Type` char(30) NOT NULL DEFAULT 'Default', 
    PRIMARY KEY (`OrderID`,`Type`), 
    CONSTRAINT `stockorder_ibfk_1` FOREIGN KEY (`OrderStockSymbol`) REFERENCES `Stock` (`StockSymbol`) ON DELETE NO ACTION ON UPDATE CASCADE, 
    CONSTRAINT `stockorder_ibfk_2` FOREIGN KEY (`OrderCustomerAccNum`) REFERENCES `Account` (`AccountNumber`) ON DELETE NO ACTION ON UPDATE CASCADE, 
    CONSTRAINT `stockorder_ibfk_3` FOREIGN KEY (`OrderCustomerID`) REFERENCES `Customer` (`SSN`) ON DELETE NO ACTION ON UPDATE CASCADE, 
    CONSTRAINT `stockorder_ibfk_4` FOREIGN KEY (`OrderEmployeeID`) REFERENCES `Employee` (`EmployeeSSN`) ON DELETE NO ACTION ON UPDATE CASCADE, 
    CONSTRAINT `stockorder_ibfk_5` FOREIGN KEY (`OrderTransactionID`) REFERENCES `StockTransaction` (`TransactionID`) ON DELETE NO ACTION ON UPDATE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 

注:另外我想你想保持你的主鍵兩個表的AUTO_INCREMENT的,但它是按照您的要求不neccessary。

相關問題