错误代码:1215:无法添加外键约束
Error Code: 1215: Cannot add foreign key constraint
因此,我在 MySQL 中创建了以下表格。
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
?
的外键
类型不匹配。 StockOrder.OrderTransactionID
是 无符号的 ,而 StockTransaction.TransactionID
是 有符号的 。让它们都签名或未签名,你应该闪闪发光。
您在哪个字段上创建外键和引用的字段架构应该完全相同,一个是签名的(默认),另一个是未签名的。所以你的架构应该如下 -
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,但根据您的要求,这不是必需的。
因此,我在 MySQL 中创建了以下表格。
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
?
类型不匹配。 StockOrder.OrderTransactionID
是 无符号的 ,而 StockTransaction.TransactionID
是 有符号的 。让它们都签名或未签名,你应该闪闪发光。
您在哪个字段上创建外键和引用的字段架构应该完全相同,一个是签名的(默认),另一个是未签名的。所以你的架构应该如下 -
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,但根据您的要求,这不是必需的。