SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';
CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci ;
USE `mydb` ;
-- -----------------------------------------------------
-- Table `mydb`.`restaurants`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`restaurants` (
`id` INT NOT NULL AUTO_INCREMENT ,
`name` VARCHAR(128) NOT NULL ,
`description` VARCHAR(1024) NOT NULL ,
`address` VARCHAR(1024) NOT NULL ,
`phone` VARCHAR(16) NOT NULL ,
`url` VARCHAR(128) NOT NULL ,
`min_order` INT NOT NULL ,
`food_types` SET('pizza', 'sushi', 'osetian_pie') NOT NULL ,
PRIMARY KEY (`id`) ,
UNIQUE INDEX `name_UNIQUE` (`name` ASC) ,
UNIQUE INDEX `id_UNIQUE` (`id` ASC) )
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `mydb`.`regions`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`regions` (
`id` INT NOT NULL AUTO_INCREMENT ,
`restaurant` INT NOT NULL ,
`name` VARCHAR(128) NOT NULL ,
PRIMARY KEY (`id`) ,
INDEX `restaurant_idx` (`restaurant` ASC) ,
UNIQUE INDEX `id_UNIQUE` (`id` ASC) ,
CONSTRAINT `restaurant`
FOREIGN KEY (`restaurant` )
REFERENCES `mydb`.`restaurants` (`id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `mydb`.`food`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`food` (
`id` INT NOT NULL ,
`type` ENUM('pizza', 'sushi', 'osetian_pie') NOT NULL ,
`name` VARCHAR(45) NOT NULL ,
`ingredients` VARCHAR(256) NULL ,
`image` VARCHAR(256) NOT NULL ,
PRIMARY KEY (`id`) ,
UNIQUE INDEX `id_UNIQUE` (`id` ASC) )
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `mydb`.`food_variant`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`food_variant` (
`id` INT NOT NULL AUTO_INCREMENT ,
`size` VARCHAR(16) NOT NULL ,
`weight` VARCHAR(16) NOT NULL ,
`price` INT NOT NULL ,
`food` INT NOT NULL ,
`restaurant` INT NOT NULL ,
PRIMARY KEY (`id`) ,
UNIQUE INDEX `id_UNIQUE` (`id` ASC) ,
INDEX `food_idx` (`food` ASC) ,
INDEX `restaurant_idx` (`restaurant` ASC) ,
CONSTRAINT `food`
FOREIGN KEY (`food` )
REFERENCES `mydb`.`food` (`id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `restaurant`
FOREIGN KEY (`restaurant` )
REFERENCES `mydb`.`restaurants` (`id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
Error is:
Executing SQL script in server
ERROR: Error 1005: Can't create table 'mydb.food_variant' (errno: 121)
重複する制約はありません。それはどこにある?
これは、列と同じ識別子を使用して少なくとも1つの制約に名前を付けているためと考えられます。
/* You already have a column named `restaurant` in this table,
but are naming the FK CONSTRAINT `restaurant` also... */
CONSTRAINT `restaurant`
FOREIGN KEY (`restaurant` )
REFERENCES `mydb`.`restaurants` (`id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
次のように、fk_restaurant
のような制約には別の識別子を使用する必要があります。
CONSTRAINT `fk_restaurant`
FOREIGN KEY (`restaurant` )
REFERENCES `mydb`.`restaurants` (`id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
そしてfood
テーブルでも同じことが:
/* Name it fk_food */
CONSTRAINT `fk_food`
FOREIGN KEY (`food` )
REFERENCES `mydb`.`food` (`id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
/* Name it fk_restaurant */
CONSTRAINT `fk_restaurant`
FOREIGN KEY (`restaurant` )
REFERENCES `mydb`.`restaurants` (`id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
それらは私が見る唯一の3つですが、見逃した他の人がいる可能性があります。
この回答は 回答へのコメント @Michael Berkowskiからのものです。それが実際に私のために働いたので、私はそれを答えとして投稿します:
複数のテーブルで制約名を変更した後でも、errno 121が発生しました。問題は、異なるテーブル間でも同じ制約名を付けることができないことでした。私は
fk_entryid
とtable1
でtable2
を使用しており、それを機能させるには、それぞれfk_table1_entryid
とfk_table2_entryid
に変更する必要がありました。
上記のすべての回答は素晴らしいですが、すべてのテーブルを削除した後でも問題は解決しませんでしたが、すべてが完全に機能し、DBを削除して再度作成した後、移行はスムーズに実行されました...キーはキャッシュされているようです。テーブルが削除された後は消去されません。
注:これは質問への回答ではありませんが、私が感じた私の経験は他の人を助けるかもしれません。