2014-03-05 23 views
5

Ich habe dieses Beispiel, wo customers_b nicht erstellt werden kann. Fehlercode 1005/errno: 121. Wenn ich jedoch zuerst customs_b als customers_a erstellt habe, wird customers_a nicht erstellt.MySQL innodb - Foreign Key: nur 1st funktioniert?

Was ist los? Warum kann ich nicht mehr als einen FK mit dem PK 'id_state' verbinden? Danke!

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'; 

DROP SCHEMA IF EXISTS `testdb` ; 
CREATE SCHEMA IF NOT EXISTS `testdb` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ; 
USE `testdb` ; 

-- ----------------------------------------------------- 
-- Table `testdb`.`state` 
-- ----------------------------------------------------- 
DROP TABLE IF EXISTS `testdb`.`state` ; 

CREATE TABLE IF NOT EXISTS `testdb`.`state` (
`id_state` INT NOT NULL, 
`abbr` CHAR(2) NOT NULL, 
PRIMARY KEY (`id_state`), 
UNIQUE INDEX `id_state_UNIQUE` (`id_state` ASC)) 
ENGINE = InnoDB; 

-- ----------------------------------------------------- 
-- Table `testdb`.`customers_a` 
-- ----------------------------------------------------- 
DROP TABLE IF EXISTS `testdb`.`customers_a` ; 

CREATE TABLE IF NOT EXISTS `testdb`.`customers_a` (
`id_customer` INT NOT NULL AUTO_INCREMENT, 
`name` VARCHAR(45) NOT NULL, 
`addr_state` INT NOT NULL, 
PRIMARY KEY (`id_customer`), 
CONSTRAINT `fk_state` 
FOREIGN KEY (`addr_state`) 
REFERENCES `testdb`.`state` (`id_state`) 
ON DELETE NO ACTION 
ON UPDATE NO ACTION) 
ENGINE = InnoDB; 


-- ----------------------------------------------------- 
-- Table `testdb`.`customers_b` 
-- ----------------------------------------------------- 
DROP TABLE IF EXISTS `testdb`.`customers_b` ; 

CREATE TABLE IF NOT EXISTS `testdb`.`customers_b` (
`id_customer` INT NOT NULL AUTO_INCREMENT, 
`name` VARCHAR(45) NOT NULL, 
`addr_state` INT NOT NULL, 
PRIMARY KEY (`id_customer`), 
CONSTRAINT `fk_state` 
FOREIGN KEY (`addr_state`) 
REFERENCES `testdb`.`state` (`id_state`) 
ON DELETE NO ACTION 
ON UPDATE NO ACTION) 
ENGINE = InnoDB; 
+0

@DaImTo Der Fehler passiert nur beim Erstellen der Tabellen, bevor Sie irgendwelche Einsätze. – Barmar

Antwort

7

Sie können nicht den gleichen Namen fk_state für beide Einschränkungen verwenden. Gib einer von ihnen einen anderen Namen.

CREATE TABLE IF NOT EXISTS `customers_b` (
`id_customer` INT NOT NULL AUTO_INCREMENT, 
`name` VARCHAR(45) NOT NULL, 
`addr_state` INT NOT NULL, 
PRIMARY KEY (`id_customer`), 
CONSTRAINT `fk_state_b` 
FOREIGN KEY (`addr_state`) 
REFERENCES `state` (`id_state`) 
ON DELETE NO ACTION 
ON UPDATE NO ACTION) 
ENGINE = InnoDB; 
+0

Du hast es! Vielen Dank! – Azevedo

2

Der Einschränkungsname für beide Tabellen ist gleich CONSTRAINT fk_state. für customer_b ändern Sie den Namen wie unten

CREATE TABLE IF NOT EXISTS `customers_a` (
`id_customer` INT NOT NULL AUTO_INCREMENT, 
`name` VARCHAR(45) NOT NULL, 
`addr_state` INT NOT NULL, 
PRIMARY KEY (`id_customer`), 
CONSTRAINT `fk_state` 
FOREIGN KEY (`addr_state`) 
REFERENCES `state` (`id_state`) 
ON DELETE NO ACTION 
ON UPDATE NO ACTION) 
ENGINE = InnoDB; 


CREATE TABLE IF NOT EXISTS `customers_b` (
`id_customer` INT NOT NULL AUTO_INCREMENT, 
`name` VARCHAR(45) NOT NULL, 
`addr_state` INT NOT NULL, 
PRIMARY KEY (`id_customer`), 
CONSTRAINT `fk_state1` <-- Here 
FOREIGN KEY (`addr_state`) 
REFERENCES `state` (`id_state`) 
ON DELETE NO ACTION 
ON UPDATE NO ACTION) 
ENGINE = InnoDB;