SQL:错误1005:无法创建表'obl2.itemsubjects'(错误号:121)

时间:2013-01-12 15:01:32

标签: mysql sql database-design create-table

我有以下表格:

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'(错误号:121)

我已经读过互联网上的错误,并且说这是MYSQL的已知问题但还没有解决方案。

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

MySQL文档在 FOREIGN KEY Constraints (强调我的)中说:

  

如果给出了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
);