2012-10-21 13 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) 

Nie widzę żadnych duplikatów ograniczeń. Gdzie to jest?Nie można utworzyć tabeli w Workbench, errno 121

Odpowiedz

20

Jest to prawdopodobnie dlatego, że nazwali przynajmniej jedno ograniczenie z tym samym identyfikatorem jako kolumny:

/* 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) 

powinny stosować inny identyfikator dla ograniczenia jak fk_restaurant jak w:

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

To samo z tabelą: :

/* 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) 

To są tylko trzy, które widzę, ale mogą istnieć inne, które przeoczyłem.

+0

Dzięki, to działało dla mnie! – arts777

+3

Na wypadek, gdyby ktoś uderzył w ten problem. Otrzymałem errno 121 nawet po zmianie nazw ograniczeń na wiele tabel. Problem polegał na tym, że nawet w różnych tabelach nie można mieć tej samej nazwy ograniczenia. Używałem "fk_entryid" w tabeli1 i tabeli2 i musiałem zmienić je odpowiednio na "fk_table1_entryid" i "fk_table2_entryid", aby działało. Stało się to z MySQLWorkbench i MariaDB w przypadku, które ma znaczenie. –

Powiązane problemy