2017-06-05 2 views
0

Ich bin völlig enttäuscht, da ich nicht genau feststellen konnte, warum meine Tabellenerstellung fehlschlägt, wenn ich versuche, eine Fremdschlüsselbeziehung zwischen meinen beiden Tabellen zu erstellen . Die SQL-Abfragen, die ich die zwei Tabellen zu erstellen, verwende sind unter:MySQL Fehler 1215: Kann keine Fremdschlüsseleinschränkung zwischen Parent und Children hinzufügen

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; 

Die Tabelle RELATION erfolgreich erstellt wurde, aber whenver Ich versuche, das Kind Tabelle (RELATION_ROLE mit Eltern als RELATION), die Tabelle zu erstellen Schöpfung versagt mit dem

Fehler 1215: Kann nicht Foreign Key Constraint

Fehlermeldung hinzufügen.

Fehle ich hier etwas?

Bitte beachten Sie, dass der Kunde ist die Haupttabelle mit Kind als VERHÄLTNIS (Customer_ID, die als Primär- und Fremdschlüssel), die weiter ein Kind hat RELATION_ROLE (RltnPrmryID ist der Primärschlüssel während RltnFrgnID der Fremdschlüssel.

Bitte helfen mir das Problem behoben bekommen

Antwort

0

äh, gibt es durchaus ein paar Probleme gibt -... insbesondere mit Tisch Design

Vor allem der STG_RELATION.RltnPrmryID ist nicht das am weitesten links stehende Feld von irgendwelchen Indizes MySQL erfordert Beide Endpunkte eines Fremdschlüssels sind die am weitesten links liegenden Felder eines Indexes. Die Felder ganz links sind diejenigen, die für Nachschlagevorgänge verwendet werden können. Dies ist der direkte Grund des Fehlers.

Zweitens ist der Primärschlüssel von STG_RELATION Tabelle ein Durcheinander. Die untergeordnete Tabelle sollte auf den Primärschlüssel oder einen eindeutigen Schlüssel aus der übergeordneten Tabelle verweisen. STG_RELATION.RltnPrmryID ist weder, es ist nur ein Teil des Primärschlüssels. Relation_Pkey Feld ist Autoinkrement bereits eindeutig identifiziert Datensätze in der Tabelle STG_RELATION, daher sollte dies die PK sein und STG_RELATION_ROLE Tabelle sollte diese Spalte im Fremdschlüssel verweisen (offensichtlich, müssen Sie den Feldtyp dafür in STG_RELATION_ROLE arbeiten arbeiten). Indizes für Ganzzahlen sind aus Leistungsperspektive viel effizienter als Indizes für Zeichenfolgen.

Verwandte Themen