2017-06-05 3 views
0

2つのテーブルの間に外部キー関係を作成しようとしているときに、テーブル作成に失敗した理由を正確に特定できませんでした。 。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として親とRELATION_ROLE)を作成しようとしています。下のように私は2つのテーブルを作成するために使用していたSQLクエリがあります

エラーメッセージを外部キー制約を追加することはできません:作成は

エラー1215で失敗しています。

ここに何か不足していますか?

さらにRltnFrgnIDが外部キーである一方、RELATION_ROLE(RltnPrmryIDが主キーである子を有している(CUSTOMER_IDは、主キーと外部キーとして機能する)その顧客がRELATIONなどの子を持つメインテーブルですのでご注意ください。

助けてください。私の問題は解決し得るために

答えて

0

ええと、そこにかなりの数の問題がある - 。あなたのテーブル設計と特には

まず、STG_RELATION.RltnPrmryIDは、任意のインデックスの一番左のフィールドではありませんMySQLが必要です。左端のフィールドとなる外部キーの両方の端点インデックスの一番左のフィールドはルックアップに使用できるフィールドです。これがエラーの直接の理由です。

第2に、STG_RELATIONテーブルの主キーが混乱します。子テーブルは、主テーブルまたは親テーブルの一意のキーを参照する必要があります。 STG_RELATION.RltnPrmryIDも、主キーの一部に過ぎません。 フィールドが自動インクリメントであるため、STG_RELATIONテーブル内のレコードが一意に識別されます。したがって、これはPKである必要があります。STG_RELATION_ROLEテーブルで外部キーのこの列を参照する必要があります。STG_RELATION_ROLEで機能するにはフィールドのタイプを調整する必要があります。整数の索引は、パフォーマンスの観点から文字列の索引よりもはるかに効率的です。

関連する問題