2012-10-21 4 views
10
SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0; 
SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; 
SET @[email protected]@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 [email protected]_SQL_MODE; 
SET [email protected]_FOREIGN_KEY_CHECKS; 
SET [email protected]_UNIQUE_CHECKS; 

Error is: 
    Executing SQL script in server 
    ERROR: Error 1005: Can't create table 'mydb.food_variant' (errno: 121) 

중복 제한이 없습니다. 어디 있니?워크 벤치에서 테이블을 만들 수 없습니다. errno 121

/* 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 같은 제한 조건에 대해 서로 다른 ID를 사용해야합니다 :

CONSTRAINT `fk_restaurant` 
    FOREIGN KEY (`restaurant`) 
    REFERENCES `mydb`.`restaurants` (`id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 

을 당신이 열과 동일한 식별자를 가진 적어도 하나 개의 제약 조건 이름 때문에

답변

20

이 보인다 그리고 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) 

내가 본 유일한 세 사람이지만 내가 놓친 사람들이있을 수 있습니다.

+0

감사합니다. – arts777

+3

누군가가이 문제에 부딪 힐 경우. 여러 테이블에 걸쳐 제약 조건 이름을 변경 한 후에도 errno 121이 나타납니다. 문제는 다른 테이블에서도 동일한 제약 조건 이름을 사용할 수 없다는 것입니다. 나는 'fk_entryid'를 table1과 table2에서 사용하고 있으며 각각 'fk_table1_entryid'와 'fk_table2_entryid'로 변경해야만 작동합니다. 이 문제는 MySQLWorkbench와 MariaDB에서 발생했습니다. –