2014-03-05 6 views
5

customers_b를 생성 할 수없는이 예제는 다음과 같습니다. 오류 코드 1005/errno : 121. 그러나 customers_a보다 먼저 customers_b를 작성하면 customers_a가 작성되지 않습니다.MySQL innodb - 외래 키 : 첫 번째 작품 만?

무엇이 잘못 되었나요? PK 'id_state'에 하나 이상의 FK를 연결할 수없는 이유는 무엇입니까? 감사합니다.

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 오류는 삽입을하기 전에 테이블을 만들 때 발생합니다. – Barmar

답변

7

두 제약 조건 모두에 대해 동일한 이름 fk_state을 사용할 수 없습니다. 그들 중 하나에게 다른 이름을 지어 라.

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

알았어! 감사! – Azevedo

2

당신의 두 테이블은 이름이 같은 CONSTRAINT fk_state입니다 제약 조건. for customer_b 그 이름을 아래와 같이 바꿉니다.

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;