5

私は次のテーブルを持っています:

CREATE  TABLE `OBL2`.`item` (
`itemID` INT NOT NULL AUTO_INCREMENT ,
`itemName` VARCHAR(45) NOT NULL ,
PRIMARY KEY (`itemID`) ,
INDEX `itemName` (`itemName` ASC) );

CREATE  TABLE `OBL2`.`subject` (
`subjectID` INT NOT NULL ,
`subjectName` VARCHAR(45) NOT NULL ,
PRIMARY KEY (`subjectID`) );

さて、接続は多対多なので、各アイテムは多くのサブジェクトを持つことができ、各サブジェクトは多くのアイテムに関連付けることができます-接続テーブルを設定したいと思います。これは私のコードです:

CREATE  TABLE `OBL2`.`itemsubjects` (
`itemID` INT NOT NULL ,
`subjectID` INT NOT NULL ,
PRIMARY KEY (`itemID`, `subjectID`) ,
INDEX `itemID_idx` (`itemID` ASC) ,
INDEX `subjectID_idx` (`subjectID` ASC) ,
CONSTRAINT `itemID`
FOREIGN KEY (`itemID` )
REFERENCES `OBL2`.`item` (`itemID` )
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT `subjectID`
FOREIGN KEY (`subjectID` )
REFERENCES `OBL2`.`subject` (`subjectID` )
ON DELETE CASCADE
ON UPDATE CASCADE);

しかし、何らかの理由で3番目のテーブルのコードは受け入れられていません。エラーメッセージが表示されます:

エラー1005:テーブル'obl2.itemsubjects'を作成できません(errno:121)

インターネットでエラーについて読んだことがありますが、これはMYSQLの既知の問題であると書かれていますが、解決策はありません。

何かご意見は?

4

1 に答える 1

4

MySQLのドキュメントは、FOREIGN KEY制約(私の強調)で次のように述べています。

CONSTRAINTシンボル句が指定されている場合、シンボル値はデータベース内で一意である必要があります。句が指定されていない場合、InnoDBは名前を自動的に作成します。

したがって、itemsubjectテーブルの作成が失敗した理由は、という名前の別の(外部キー)制約、itemIDまたはsubjectIDデータベースの他のテーブルで名前が付けられた制約があったためです。

データベース全体で標準的な命名規則があると便利です。ColumnName_idxインデックスの場合と同様にReferencedTable_ReferencingTable_FK、外部キー制約に使用できます。

CREATE  TABLE OBL2.itemsubjects (
  itemID INT NOT NULL ,
  subjectID INT NOT NULL ,
  PRIMARY KEY 
    (itemID, subjectID) ,
  INDEX itemID_idx                           -- I like these 
    (itemID ASC) ,
  INDEX subjectID_idx                        -- two
    (subjectID ASC) ,
  CONSTRAINT item_itemsubject_FK             -- what I propose, here
    FOREIGN KEY (itemID)
    REFERENCES OBL2.item (itemID)
      ON DELETE CASCADE
      ON UPDATE CASCADE,
  CONSTRAINT subject_itemsubject_FK          -- and here 
    FOREIGN KEY (subjectID)
    REFERENCES OBL2.subject (subjectID)
      ON DELETE CASCADE
      ON UPDATE CASCADE
); 
于 2013-01-13T12:05:29.610 に答える