【问题标题】:SQL : ERROR 1005: Can't create table 'obl2.itemsubjects' (errno: 121)SQL : 错误 1005: 无法创建表 'obl2.itemsubjects' (errno: 121)
【发布时间】:2012-12-27 00:04:29
【问题描述】:

我有以下表格:

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);

但由于某种原因,第三张表的代码未被接受。 我收到一条错误消息:

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

我在互联网上阅读了有关该错误的信息,它说这是 MYSQL 的一个已知问题,但没有解决方案。

有什么想法吗?

【问题讨论】:

  • 您可以尝试在脚本中的前两个表中插入一些数据,然后为第三个表添加创建表吗?
  • 嘿 bonCondigo,我现在试过了.. 仍然是同样的错误。我不得不说我之前对作者做过同样的事情,而且效果很好。我可以弄清楚为什么主题会失败。
  • 你必须用 db 给出明确的表名吗?
  • 嗯,我更喜欢它具有相同的名称......它不应该引起问题......如果我运行查询并按“SKIP SQL GENERATION”它工作正常。它只是不会添加外键...
  • 尝试更改约束名称:CONSTRAINT item_itemsubject_FK FOREIGN KEY (itemID) ...

标签: mysql sql database-design create-table


【解决方案1】:

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

如果给出了CONSTRAINT 符号子句,则symbol 值必须在数据库中是唯一的。如果没有给出子句,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
); 

【讨论】:

    猜你喜欢
    • 2012-09-19
    • 2016-09-07
    • 1970-01-01
    • 1970-01-01
    • 2013-07-22
    • 2017-08-20
    • 2011-02-17
    • 2017-04-09
    • 2016-10-12
    相关资源
    最近更新 更多