2016-06-26 18 views
0

Ich bekomme den Fehler '#1215 Cannot add foreign key' beim Versuch, Ingenieur von Mysql Workbench zu übermitteln.Kann Fremdschlüssel nicht hinzufügen # 1215

Ich habe eine Rechteck-Tabelle, die Spalten in Skalen und Entitäten Tabelle referenziert. Die Create-Rechteckanweisung gibt den Fehler aus.

Das ist mein Schema

-- ----------------------------------------------------- 
-- Table `newDb`.`Scales` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `newDb`.`Scales` (
    `idScales` INT NOT NULL AUTO_INCREMENT, 
    `scale_name` VARCHAR(100) NULL, 
    `pid` INT NULL, 
    `col_Id` INT NULL, 
    `type` VARCHAR(45) NULL, 
    `range_from` INT NULL, 
    `range_to` INT NULL, 
    `bandpadding` INT NULL, 
    PRIMARY KEY (`idScales`), 
    UNIQUE INDEX `idScales_UNIQUE` (`idScales` ASC), 
    INDEX `pid_idx` (`pid` ASC), 
    INDEX `col_id_idx` (`col_Id` ASC), 
    CONSTRAINT `pid` 
    FOREIGN KEY (`pid`) 
    REFERENCES `newDb`.`projects` (`pid`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION, 
    CONSTRAINT `col_id` 
    FOREIGN KEY (`col_Id`) 
    REFERENCES `newDb`.`data_sets_columns` (`col_Id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 

-- ----------------------------------------------------- 
-- Table `newDb`.`Entities` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `newDb`.`Entities` (
    `idEntities` INT NOT NULL AUTO_INCREMENT, 
    `entity_name` VARCHAR(100) NULL, 
    `entity_type` VARCHAR(45) NULL, 
    `pid` INT NOT NULL, 
    PRIMARY KEY (`idEntities`), 
    UNIQUE INDEX `idEntities_UNIQUE` (`idEntities` ASC), 
    INDEX `pid_idx` (`pid` ASC), 
    CONSTRAINT `pidEF` 
    FOREIGN KEY (`pid`) 
    REFERENCES `newDb`.`projects` (`pid`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 


-- ----------------------------------------------------- 
-- Table `newDb`.`Rectangle` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `newDb`.`Rectangle` (
    `idRectangle` INT NOT NULL AUTO_INCREMENT, 
    `rect_name` VARCHAR(100) NULL, 
    `X_pos` INT NOT NULL DEFAULT 0, 
    `Y_pos` INT NOT NULL DEFAULT 0, 
    `Height` INT NOT NULL DEFAULT 50, 
    `Width` INT NOT NULL DEFAULT 50, 
    `Offset_X` INT NOT NULL DEFAULT 0, 
    `Offset_Y` INT NOT NULL DEFAULT 0, 
    `Opacity` INT NULL DEFAULT 100, 
    `Color` VARCHAR(10) NOT NULL DEFAULT 'black', 
    `idScale` INT NOT NULL, 
    `idEntities` INT NOT NULL, 
    `idColorScale` INT NULL, 
    PRIMARY KEY (`idRectangle`), 
    UNIQUE INDEX `idRectangle_UNIQUE` (`idRectangle` ASC), 
    INDEX `idScales_idx` (`idScale` ASC, `idColorScale` ASC), 
    INDEX `idEntities_idx` (`idEntities` ASC), 
    CONSTRAINT `idScalesF` 
    FOREIGN KEY (`idScale` , `idColorScale`) 
    REFERENCES `newDb`.`Scales` (`idScales` , `idScales`) 
    ON DELETE RESTRICT 
    ON UPDATE RESTRICT, 
    CONSTRAINT `idEntitiesF` 
    FOREIGN KEY (`idEntities`) 
    REFERENCES `newDb`.`Entities` (`idEntities`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 

Es gibt eine andere Frage ist: MySQL Error 1215: Cannot add foreign key constraint für die gleiche Sache zu fragen.

Ich folgte ihm und nach der Antwort habe ich entweder nicht übereinstimmende Engine, nicht übereinstimmenden Spaltentyp oder nicht übereinstimmende Spalten.

Ich sehe keine Übereinstimmungen obwohl alle meine referenzierten Spalten und Fremdschlüsselcolumns sind unsigned INTs, der Name ist gleich, und die Engine ist INNODB.

Kann scheinen nicht zu finden, was ich hier

fehle
+0

Welche 'CREATE TABLE' wirft diesen Fehler? – duskwuff

+0

Entschuldigen Sie, wenn Sie erwähnen, dass Sie ein Rechteck erstellen, wenn es auf Spalten von Skalen und Entitäten verweist – Snedden27

Antwort

1

Die folgende Einschränkung macht keinen Sinn:

CONSTRAINT `idScalesF` 
    FOREIGN KEY (`idScale` , `idColorScale`) 
    REFERENCES `newDb`.`Scales` (`idScales` , `idScales`) 
    ON DELETE RESTRICT 
    ON UPDATE RESTRICT, 

Dies liest sich wie Sie versuchen, jede Zeile in Rectangle ein zu sagen, dass haben Paar idScale und idColorScale, die ein Paar Spalten in Scales, die beide idScales genannt werden, entspricht. Wenn Sie versuchen, zu sagen, dass idScale und idColorScale jeweils eine Zeile in Scales referenzieren, muss dies als zwei separate Fremdschlüssel ausgeschrieben werden.

Nebenbei ist ein PRIMARY KEY immer implizit eindeutig und fungiert als ein Index. Die von Ihnen erstellten Indizes …_UNIQUE (z. B. idScales_UNIQUE) sind alle redundant und sollten entfernt werden.

Verwandte Themen