Я нахожу innodb довольно раздражающим, когда пытаюсь спроектировать структуру БД, по крайней мере, по сравнению с MyIsam, которая, кажется, имеет меньшие ограничения
Скажите, если я хочу создать простую библиотечную систему.
И у меня есть четыре стола.
1, таблица book_item
, в которой записаны имя книги, имя автора, время публикации и основная информация о книгах
2, таблица book
, представляющая конкретный реальный объект предмета книги. Таким образом, объект book_item может относиться ко многим объектам книги.
3, таблица tag
, представляющая тег книги. Как наука, литература, архитектура и т. Д.
4, таблица tag_book_item_relation
, которая связывает теги с book_items.
Итак, отношения такие, как показано ниже.
1, у нас есть элемент книги до книга это отношение один ко многим отношение
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
или tag_book_item_relation
на MyISAM , все будет хорошо.
Итак, мне интересно, что идет не так, если я использую двигатель innodb для таблицы book
и tag_book_item_relation
Сценарий sql находится здесь (прямое проектирование в MySQL Workbench):
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;