2017-06-05 53 views
0

我完全失望,因为我未能明确指出确切原因,为什么当我尝试在两个表之间创建外键关系时表创建失败。我使用创建2代表的SQL查询是为下:MySQL错误1215:无法在父级和子级之间添加外键约束

CREATE TABLE `OneMD_DEA_EMEA_STG_CUSTOMER` (
    `Customer_Pkey` int(11) NOT NULL AUTO_INCREMENT, 
    `CustomerID` varchar(15) NOT NULL, 
    `DataType` varchar(10) NOT NULL, 
    `SourceSystemName` varchar(10) NOT NULL, 
    `SourceCountry` varchar(2) NOT NULL, 
    `SrcDataRfrshDt` date NOT NULL, 
    `StartDt` date NOT NULL, 
    `EndDt` date NOT NULL, 
    `Category` varchar(50) DEFAULT NULL, 
    PRIMARY KEY (`Customer_Pkey`,`CustomerID`), 
    UNIQUE KEY `CustomerID_UNIQUE` (`CustomerID`), 
    KEY `idx_OneMD_DEA_EMEA_STG_CUSTOMER` (`DataType`,`SrcDataRfrshDt`,`SourceCountry`,`EndDt`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 



CREATE TABLE `STG_RELATION` (
     `Relation_Pkey` int(11) NOT NULL AUTO_INCREMENT, 
     `RelationType` varchar(15) NOT NULL, 
     `SourceDataType` varchar(5) NOT NULL, 
     `SourceID` varchar(15) NOT NULL, 
     `TargetDataType` varchar(5) NOT NULL, 
     `TargetID` varchar(15) NOT NULL, 
     `RltnPrmryID` varchar(50) NOT NULL, 
     `SourceSystemName` varchar(10) DEFAULT NULL, 
     `SourceCountry` varchar(2) NOT NULL, 
     `SrcDataRfrshDt` date NOT NULL, 
     `StartDt` date NOT NULL, 
     `EndDt` date NOT NULL, 
     `HCPHCOSubType` varchar(10) DEFAULT NULL, 
     `HCPHCOLinkType` varchar(10) DEFAULT NULL, 
     `HCOHCOSubType` varchar(10) DEFAULT NULL, 
     `HCOHCOLinkType` varchar(10) DEFAULT NULL, 
     PRIMARY KEY (`Relation_Pkey`,`SourceID`,`TargetID`,`RltnPrmryID`), 
     UNIQUE KEY `Relation_Pkey_UNIQUE` (`Relation_Pkey`), 
     KEY `idx_STG_RELATION` (`RelationType`,`SrcDataRfrshDt`,`SourceCountry`,`EndDt`), 
     KEY `Source_ID_idx` (`SourceID`), 
     KEY `Target_ID_idx` (`TargetID`), 
     CONSTRAINT `Source_ID` FOREIGN KEY (`SourceID`) REFERENCES `STG_CUSTOMER` (`CustomerID`) ON DELETE CASCADE ON UPDATE NO ACTION, 
     CONSTRAINT `Target_ID` FOREIGN KEY (`TargetID`) REFERENCES `STG_CUSTOMER` (`CustomerID`) ON DELETE CASCADE ON UPDATE NO ACTION 
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

    CREATE TABLE `STG_RELATION_ROLE` (
      `RltnRole_PKey` int(11) NOT NULL AUTO_INCREMENT, 
      `SourceSystemName` varchar(10) NOT NULL, 
      `ActivityID` varchar(15) NOT NULL, 
      `RltnFrgnID` varchar(50) NOT NULL, 
      `SrcDataRfrshDt` date NOT NULL, 
      `StartDt` date NOT NULL, 
      `EndDt` date NOT NULL, 
      `SourceCountry` varchar(2) NOT NULL, 
      `HCPHCORoleType` varchar(10) DEFAULT NULL, 
      `HCPHCORoleField` varchar(10) DEFAULT NULL, 
      `HCPHCORole` varchar(10) DEFAULT NULL, 
      `HCPHCORoleStatus` varchar(20) DEFAULT NULL, 
      PRIMARY KEY (`RltnRole_PKey`,`SourceSystemName`,`ActivityID`,`RltnFrgnID`), 
      KEY `idx_STG_RELATION_ROLE` (`SrcDataRfrshDt`,`SourceSystemName`,`SourceCountry`,`EndDt`), 
      KEY `Rltn_Frgn_ID_idx` (`RltnFrgnID`), 
      CONSTRAINT `RltnFrgnID` FOREIGN KEY (`RltnFrgnID`) REFERENCES `STG_RELATION` (`RltnPrmryID`) ON DELETE CASCADE ON UPDATE NO ACTION 
     ) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

表关系得到了成功创建,但whenver我想创建子表(RELATION_ROLE与父母的关系),表创建与

错误1215失败:无法添加外键约束

错误消息。

我在这里错过了什么吗?

请注意,顾客是与孩子的关系主表(CUSTOMER_ID作为主键和外键),其还具有一个孩子RELATION_ROLE(RltnPrmryID是主键,而RltnFrgnID是外键。

请帮助我得到这个问题解决

回答

0

呃,有相当存在一些问题 - 。特别是你的表的设计

首先,在STG_RELATION.RltnPrmryID没有任何索引的最左场MySQL的要求外键的两个端点都是最左边的字段的索引。最左边的字段是可用于查找的字段。这是错误的直接原因。

其次,STG_RELATION表的主键是乱七八糟的。子表应该引用父表或父表中的唯一键。 STG_RELATION.RltnPrmryID既不是,它只是主键的一部分。 Relation_Pkey字段正在自动增加,已经唯一标识了STG_RELATION表内的记录,所以这应该是PK和STG_RELATION_ROLE表应该在外键引用此列(显然,您需要调整字段类型以使其在STG_RELATION_ROLE中工作)。从性能角度来看,整数索引比字符串索引效率更高。

相关问题