当我尝试设计数据库结构时,我发现innodb非常烦人,至少与MyIsam比较,后者似乎有较少的限制
说,如果我想创建一个简单的库系统。 我有四张桌子。
1,表book_item
,记录book_name,作者,发布时间和有关书籍的基本信息
2,表book
,表示书籍项目的特定真实对象。因此book_item对象可以与许多书籍对象相关。
3,表tag
,代表书签。像科学,文学,建筑等。
4,表tag_book_item_relation
,它将标签与book_items相关联。
所以,关系如下。
1,我们有一个图书项目到图书是一对多关系
2, book_item 与标记是多对多关系。
请注意,此表的引擎都是 innodb 如果我尝试创建表,它将失败:
Error:
Executing SQL script in server
ERROR: Error 1005: Can't create table 'yet_another_test.book' (errno: 121)
但是,如果我将book
或tag_book_item_relation
的引擎更改为 MyISAM ,一切都会好的。
所以,我想知道如果我对表book
和tag_book_item_relation
使用引擎 innodb 会出现什么问题
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;
答案 0 :(得分:2)
“CREATE TABLE book
”似乎存在外键约束fk_book_item
与tag_book_item_relation
中的约束具有相同名称的问题。尝试在book
中使用另一个名称作为约束,并且CREATE TABLE应该可以正常工作。
这在MyISAM中不是问题,因为它们没有外键的概念,因此忽略了FK约束。
希望这有帮助!
答案 1 :(得分:1)
错误121说“表创建失败,因为未正确形成外键约束。如果错误消息引用错误-1,则表创建可能失败,因为该表包含与内部InnoDB表的名称匹配的列名。“
索引名称和约束名称可能相同,请尝试创建表格进行更改。
答案 2 :(得分:1)
创建没有Foreign Key
约束的表。尽管相同的语句与MyISAM引擎一起使用,但是在那里默默地忽略了约束 - 这就是为什么你没有得到错误。如果您确实需要这些约束,请正确创建它们。但是,我通常倾向于避免FK约束并在应用程序级别实现约束。
我立即发现的一个问题是您的约束符号在数据库级别必须是唯一的,并且fk_book_item
表和tag_book_item_relation
表
答案 3 :(得分:1)
此错误消息表示某处存在重复的密钥。它可能是由外键约束中的名称冲突引起的;您不能在不同的表中使用相同的外键名称。 (我不知道您的数据库中可能包含哪些其他表。)
通常,错误是由InnoDB内部字典中已存在的表引起的,即使.frm文件已经消失。如果是这种情况,那么最简单的方法是对数据执行sql转储,删除数据库,重新创建数据库,然后从转储中加载数据。