当我尝试设计一个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)
但是,如果我将引擎更改为或book
MyISAM ,一切都会好起来的。tag_book_item_relation
所以,我想知道如果我将引擎innodb用于表book
和tag_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;