1

2つのテーブル間に多対多の関係を作成しようとしていますMysql WorkBenchでは、2つのテーブルの1つに複合主キーがありますキー)。私はこのエラーを取得していますSQLを生成しようとしているとき:外部複合キーのMysql複合キー

ERROR: Error 1215: Cannot add foreign key constraint

SQLコード:

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 

-- ----------------------------------------------------- 
    -- 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からの私は、このメッセージを見ることができますSHOW CREATE TABLE ResourcesおよびSHOW 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
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`) 

オーナーグループテーブルには、列idがありません。主キーはidOwnerGroupsです。あなたが参照する他の2つの列はまったくありません。一般的に


、あなたが外部キーを宣言するときに、最初にあなたは、子テーブルの列名:

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制約でその索引が使用されます)。

他の2つの列OwnerGroups_Instances_has_Customers_Instances_idInstancesOwnerGroups_Instances_has_Customers_Customers_idCustomersの意味を理解していません。通常、多対多の表では、それぞれの親表の主キーを参照するのに十分な列が必要です。


あなたのコメントを再:

あなたは随時スキーマのビューをリフレッシュしてみてください。 "SCHEMAS"の右側には、曲がる矢印のペアが付いたボタンがあります。

enter image description here

+0

ありがとうございます。私はそれがWBから来ていることに気付きました。 idResourcesという名前のIDをidに変更しました。それはまだスクリプトの中にあります。左のパネルでは重複した名前のテーブルも見ることができます。これは削除されました。私はResources_has_OwnerGroupsを削除しましたが、それはまだスクリプトに残っています。 はWBなので盗まれていますか? –

+0

あなたのコメントが正しく理解されたら、コンポジットキーのベストプラクティスは何ですか? テーブルResources_has_OwnerGroups: によって作成された新しいキーResources_has_OwnerGroups_idを作成してみましょう: fk_Resources_idとfk_OwnerGroups_id? –

+0

'PRIMARY KEY(Resources_id、OwnerGroups_id)'がベストプラクティスです。より多くの列を含めると、最初の2つの列に関して重複が存在することができます。主キーのメンバーは、FK制約ではなく、*列*です。 –