Mysql复合键出了一个外来的复合键

时间:2017-02-08 16:08:35

标签: mysql many-to-many foreign-key-relationship composite-primary-key composite-key

我正在尝试在两个表之间建立多对多关系在Mysql WorkBench中,这两个表中的一个具有复合主键(部件来自2个外键)。当我尝试生成SQL时,我收到此错误:

  

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

SQL代码:

    -- -----------------------------------------------------
    -- Table `A_D_schema`.`Resources_has_OwnerGroups`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `A_D_schema`.`Resources_has_OwnerGroups` (
      `Resources_id` INT NOT NULL,
      `OwnerGroups_id` INT NOT NULL,
      `OwnerGroups_Instances_has_Customers_Instances_idInstances` INT NOT NULL,
      `OwnerGroups_Instances_has_Customers_Customers_idCustomers` INT NOT NULL,
      PRIMARY KEY (`Resources_id`, `OwnerGroups_id`, `OwnerGroups_Instances_has_Customers_Instances_idInstances`, `OwnerGroups_Instances_has_Customers_Customers_idCustomers`),
      INDEX `fk_Resources_has_OwnerGroups_OwnerGroups1_idx` (`OwnerGroups_id` ASC, `OwnerGroups_Instances_has_Customers_Instances_idInstances` ASC, `OwnerGroups_Instances_has_Customers_Customers_idCustomers` ASC),
      INDEX `fk_Resources_has_OwnerGroups_Resources1_idx` (`Resources_id` ASC),
      CONSTRAINT `fk_Resources_has_OwnerGroups_Resources1`
        FOREIGN KEY (`Resources_id`)
        REFERENCES `A_D_schema`.`Resources` (`id`)
        ON DELETE NO ACTION
        ON UPDATE NO ACTION,
      CONSTRAINT `fk_Resources_has_OwnerGroups_OwnerGroups1`
        FOREIGN KEY (`OwnerGroups_id` , `OwnerGroups_Instances_has_Customers_Instances_idInstances` , `OwnerGroups_Instances_has_Customers_Customers_idCustomers`)
        REFERENCES `A_D_schema`.`OwnerGroups` (`id` , `Instances_has_Customers_Instances_idInstances` , `Instances_has_Customers_Customers_idCustomers`)
        ON DELETE NO ACTION
        ON UPDATE NO ACTION)
    ENGINE = InnoDB

SHOW ENGINE INNODB STATUS我可以看到此消息:

Cannot resolve column name close to:
)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_Resources_has_OwnerGroups_OwnerGroups1`
    FOREIGN KEY (`OwnerGroups_id` , `OwnerGroups_Instances_has_Customers_Instances_idInstances` , `OwnerGroups_Instances_has_Customers_Customers_idCustomers`)
    REFERENCES `A_D_schema`.`OwnerGroups` (`id` , `Instances_has_Customers_Instances_idInstances` , `Instances_has_Customers_Customers_idCustomers`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB

SHOW CREATE TABLE ResourcesSHOW CREATE TABLE OwnerGroups

CREATE TABLE `Resources` (
  `idResources` int(11) NOT NULL AUTO_INCREMENT,
  `email` varchar(45) DEFAULT NULL,
  `role` int(11) DEFAULT NULL COMMENT 'role : 1 disptcher \n0 admin',
  PRIMARY KEY (`idResources`),
  UNIQUE KEY `idresources_UNIQUE` (`idResources`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `OwnerGroups` (
  `idOwnerGroups` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(45) DEFAULT NULL,
  `group` int(11) DEFAULT NULL,
  PRIMARY KEY (`idOwnerGroups`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

1 个答案:

答案 0 :(得分:1)

  CONSTRAINT `fk_Resources_has_OwnerGroups_Resources1`
    FOREIGN KEY (`Resources_id`)
    REFERENCES `A_D_schema`.`Resources` (`id`)

您的资源表没有列id。它的主键是idResources

  CONSTRAINT `fk_Resources_has_OwnerGroups_OwnerGroups1`
    FOREIGN KEY (`OwnerGroups_id` , `OwnerGroups_Instances_has_Customers_Instances_idInstances` , `OwnerGroups_Instances_has_Customers_Customers_idCustomers`)
    REFERENCES `A_D_schema`.`OwnerGroups` (`id` , `Instances_has_Customers_Instances_idInstances` , `Instances_has_Customers_Customers_idCustomers`)

您的OwnerGroups表没有列id。它的主键是idOwnerGroups。它根本没有你引用的其他两列。

通常,在声明外键时,首先要在子表中命名列:

CREATE TABLE Child (
  childCol1 INT,
  childCol2 INT,
...
FOREIGN KEY (childCol1, childCol2) ...

然后引用父表中的列:

... REFERENCES Parent (parentCol1, parentCol2)
);

您必须使用父表中存在的列名称。

您在父表中引用的列必须一起是该表的PRIMARY KEY或UNIQUE KEY。换句话说,在上面的示例中,它不适用于此父表:

CREATE TABLE Parent (
  parentCol1 INT,
  parentCol2 INT,
  PRIMARY KEY (parentCol1)
);

因为PRIMARY KEY不包含parentCol2。

在您的情况下,以下内容应该有效:

CREATE TABLE IF NOT EXISTS `A_D_schema`.`Resources_has_OwnerGroups` (
  `Resources_id` INT NOT NULL,
  `OwnerGroups_id` INT NOT NULL,
  `OwnerGroups_Instances_has_Customers_Instances_idInstances` INT NOT NULL,
  `OwnerGroups_Instances_has_Customers_Customers_idCustomers` INT NOT NULL,
  PRIMARY KEY (`Resources_id`, `OwnerGroups_id`, `OwnerGroups_Instances_has_Customers_Instances_idInstances`, `OwnerGroups_Instances_has_Customers_Customers_idCustomers`),
  CONSTRAINT `fk_Resources_has_OwnerGroups_Resources1`
    FOREIGN KEY (`Resources_id`)
    REFERENCES `A_D_schema`.`Resources` (`idResources`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_Resources_has_OwnerGroups_OwnerGroups1`
    FOREIGN KEY (`OwnerGroups_id`)
    REFERENCES `A_D_schema`.`OwnerGroups` (`idOwnerGroups`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION
) ENGINE = InnoDB

我拿出了一些冗余的INDEX定义。您不需要索引PRIMARY KEY,它已经是表的聚簇索引。您不需要索引在外键声明中使用的列,如果需要,MySQL将自动索引该列(尽管如果该列已存在索引,则FK约束将使用该索引)。 / p>

我不确定我理解您的其他两列OwnerGroups_Instances_has_Customers_Instances_idInstancesOwnerGroups_Instances_has_Customers_Customers_idCustomers的意图。通常在多对多表中,您只需要足够的列来引用相应父表的主键。

重新评论:

您应该不时尝试刷新架构的视图。在" SCHEMAS"右侧有一个带有一对弯曲箭头的按钮。

enter image description here