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

Ich sehe keine doppelten Einschränkungen. Wo ist es?Kann Tabelle in Workbench nicht erstellen, errno 121

Antwort

20

Dies ist wahrscheinlich, weil Sie mindestens eine Einschränkung mit der gleichen Kennung wie eine Spalte mit dem Namen haben:

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

: wie fk_restaurant wie in eine andere Kennung für die Einschränkung

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

Sollte verwenden Und das gleiche in der food Tabelle:

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

Das sind die einzigen drei, die ich sehe, aber es könnte andere geben, die ich vermisst habe.

+0

Danke, das hat für mich funktioniert! – arts777

+3

Falls jemand dieses Problem hat. Ich bekam das errno 121 auch nach dem Ändern der Constraint-Namen über mehrere Tabellen hinweg. Das Problem bestand darin, dass Sie nicht über verschiedene Tabellen hinweg denselben Einschränkungsnamen haben können. Ich habe 'fk_entryid' in table1 und table2 verwendet und musste sie in 'fk_table1_entryid' bzw. 'fk_table2_entryid' ändern, damit es funktioniert. Dies geschah mit MySQLWorkbench und MariaDB, falls das wichtig ist. –

Verwandte Themen