0

当我尝试设计一个db结构时,我发现innodb很烦人,至少与MyIsam相比,MyIsam似乎限制较少

比如说,如果我想创建一个简单的图书馆系统。我有四张桌子。

1、table book_item,记录书名、作者、出版时间等书籍的基本信息

2、table book,它代表了书项的具体实物。所以一个 book_item 对象可以关联到许多 book 对象。

3、table tag,代表一个书的标签。喜欢科学、文学、建筑等等。

4, table tag_book_item_relation,将标签与 book_items 相关联。

所以,关系如下。

1、我们有一个book item to book一对多的关系

2、book_item to tag多对多的关系。

请注意,表的引擎都是innodb 如果我尝试创建表,它将失败:

Error:
Executing SQL script in server
ERROR: Error 1005: Can't create table 'yet_another_test.book' (errno: 121)

但是,如果我将引擎更改为或bookMyISAM 一切都会好起来的。tag_book_item_relation

所以,我想知道如果我将引擎innodb用于表booktag_book_item_relation

sql脚本在这里(MySQL工作台中的正向工程):

CREATE  TABLE IF NOT EXISTS `yet_another_test`.`tag` (
  `id` INT NOT NULL AUTO_INCREMENT ,
  PRIMARY KEY (`id`) ,
  UNIQUE INDEX `id_UNIQUE` (`id` ASC) )
ENGINE = InnoDB;

CREATE  TABLE IF NOT EXISTS `yet_another_test`.`book_item` (
  `id` INT NOT NULL AUTO_INCREMENT ,
  PRIMARY KEY (`id`) ,
  UNIQUE INDEX `id_UNIQUE` (`id` ASC) )
ENGINE = InnoDB;

CREATE  TABLE IF NOT EXISTS `yet_another_test`.`tag_book_item_relation` (
  `book_item_id` INT NOT NULL ,
  `tag_id` INT NOT NULL ,
  PRIMARY KEY (`book_item_id`, `tag_id`) ,
  INDEX `fk_tag` (`tag_id` ASC) ,
  INDEX `fk_book_item` (`book_item_id` ASC) ,
  CONSTRAINT `fk_tag`
    FOREIGN KEY (`tag_id` )
    REFERENCES `yet_another_test`.`tag` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_book_item`
    FOREIGN KEY (`book_item_id` )
    REFERENCES `yet_another_test`.`book_item` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

CREATE  TABLE IF NOT EXISTS `yet_another_test`.`book` (
  `id` INT NOT NULL AUTO_INCREMENT ,
  `book_item_id` INT NOT NULL ,
  PRIMARY KEY (`id`, `book_item_id`) ,
  INDEX `fk_book_item` (`book_item_id` ASC) ,
  UNIQUE INDEX `id_UNIQUE` (`id` ASC) ,
  CONSTRAINT `fk_book_item`
    FOREIGN KEY (`book_item_id` )
    REFERENCES `yet_another_test`.`book_item` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;
4

4 回答 4

2

“CREATE TABLE”似乎存在一个问题,book即外键约束fk_book_itemtag_book_item_relation. 尝试为约束使用另一个名称,bookCREATE TABLE 应该可以正常工作。

这在 MyISAM 中不是问题,因为它们没有外键的概念,因此忽略了 FK 约束。

希望这可以帮助!

于 2011-06-28T05:53:07.390 回答
1

错误 121 表示“表创建失败,因为未正确形成外键约束。如果错误消息涉及错误 –1,则表创建可能失败,因为该表包含与内部 InnoDB 表的名称匹配的列名。”

关联

Index Name 和 Constraint Name 可能相同,请更改尝试创建表。

于 2011-06-28T03:55:19.990 回答
1

创建没有Foreign Key约束的表。虽然相同的语句适用于 MyISAM 引擎,但约束在那里被静默忽略 - 这就是您没有收到错误的原因。如果您真的需要这些约束,请正确创建它们。但是,我通常倾向于避免 FK 约束并在应用程序级别实现约束。

我立即发现的一个问题是您的约束符号在数据库级别必须是唯一的,并且您fk_book_itemtag_book_item_relation表和book表上都有

于 2011-06-28T03:55:25.683 回答
1

此错误消息表示某处存在重复键。它可能是由外键约束中的名称冲突引起的;您不能在不同的表中使用相同的外键名称。(我不知道您的数据库中可能还有哪些其他表。)

通常,错误是由 InnoDB 内部字典中已经存在的表引起的,即使 .frm 文件已经消失。如果是这种情况,那么最简单的做法是对数据进行 sql 转储,删除数据库,重新创建它,然后从转储中加载数据。

于 2011-06-28T04:03:46.220 回答