2016-03-22 47 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

外部キーと参照フィールドスキーマを作成するフィールドは、ここでは完全に同じである必要があります。ここでは、1つは符号付き(デフォルト)で、もう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; 

below-ごとに次のようになります。また、私はあなたがAUTO_INCREMENTとして両方のテーブルのプライマリキーを維持したいと思うが、それはあなたの条件必要ありませんどおりです。

関連する問題