2011-02-24 2 views
1

내가 MySQL의 새로운 오전과 복잡한 EER 다이어그램을 생성했다 : 테이블 'xxx.xxx'(121 errno에를) 만들 수 없습니다. 생성 후, 나는 "Forward Engineer ..."모델을 사용하고 두려운 오류를 쳤습니다. 오류 1005 : 'xxx.xxx'테이블을 만들 수 없습니다 (errno : 121). 1 : M 관계가있는 두 개의 테이블을 단순화 한 다른 모델을 만들었지 만 기본 키와 외래 키 이름에 "id_"를 사용했습니다. 그게 효과가 있었어.는 오류 1005가 발생합니다

i.e. 
TABLE_A 
    id_TABLE_A INT 

TABLE_B 
    id_TABLE_B INT 
    id_TABLE_A INT 

, TABLE_A [1] 사이의 다양한 관계로 존재하는 - < [M] TABLE_B 및 TABLE_B.id_TABLE_A는 외국 내 복잡한 EER도 찾고

키 I를 고지함으로써 프라이 머리 키 이름과 외래 키 이름에 밑줄이없는 "id"를 사용했습니다. 나는 "id"뒤에 밑줄을 삽입했고 Forward Engineer는 모델을 수정했는데 오류없이 작동했습니다. 여기에 두 가지 간단한 예제 모델이 있습니다. 하나는 "id_"이고 다른 하나는 "id"입니다. "id_"로 인해 오류 1005가 발생하지 않고 "id"로 인해 오류 1005가 발생합니다. MySQL에서이 예외가 발생하는 이유에 대해 알고있는 사람이 있습니까?

============================================= ================================== 좋은 모델 :

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

CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci ; 
USE `mydb` ; 

DROP TABLE IF EXISTS `mydb`.`TABLE_A` ; 

CREATE TABLE IF NOT EXISTS `mydb`.`TABLE_A` (
    `id_TABLE_A` INT NOT NULL AUTO_INCREMENT , 
    PRIMARY KEY (`id_TABLE_A`) , 
    UNIQUE INDEX `id_TABLE_A_UNIQUE` (`id_TABLE_A` ASC)) 
ENGINE = InnoDB; 


DROP TABLE IF EXISTS `mydb`.`TABLE_B` ; 

CREATE TABLE IF NOT EXISTS `mydb`.`TABLE_B` (
    `id_TABLE_B` INT NOT NULL AUTO_INCREMENT , 
    `id_TABLE_A` INT NOT NULL , 
    PRIMARY KEY (`id_TABLE_B`) , 
    UNIQUE INDEX `id_TABLE_B_UNIQUE` (`id_TABLE_B` ASC) , 
    INDEX `id_TABLE_A` (`id_TABLE_A` ASC) , 
    CONSTRAINT `id_TABLE_A` 
    FOREIGN KEY (`id_TABLE_A`) 
    REFERENCES `mydb`.`TABLE_A` (`id_TABLE_A`) 
    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; 

결과 :

Build is successful. 

========================================== =====================================

,

나쁜 모델 :

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

CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci ; 
USE `mydb` ; 


DROP TABLE IF EXISTS `mydb`.`TABLE_A` ; 

CREATE TABLE IF NOT EXISTS `mydb`.`TABLE_A` (
    `idTABLE_A` INT NOT NULL AUTO_INCREMENT , 
    PRIMARY KEY (`idTABLE_A`) , 
    UNIQUE INDEX `idTABLE_A_UNIQUE` (`idTABLE_A` ASC)) 
ENGINE = InnoDB; 


DROP TABLE IF EXISTS `mydb`.`TABLE_B` ; 

CREATE TABLE IF NOT EXISTS `mydb`.`TABLE_B` (
    `idTABLE_B` INT NOT NULL AUTO_INCREMENT , 
    `idTABLE_A` INT NOT NULL , 
    PRIMARY KEY (`idTABLE_B`) , 
    UNIQUE INDEX `idTABLE_B_UNIQUE` (`idTABLE_B` ASC) , 
    INDEX `idTABLE_A` (`idTABLE_A` ASC) , 
    CONSTRAINT `idTABLE_A` 
    FOREIGN KEY (`idTABLE_A`) 
    REFERENCES `mydb`.`TABLE_A` (`idTABLE_A`) 
    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; 

결과 : 당신의 제약 조건 이름이 다른 이름과 충돌하는 경우

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

CREATE TABLE IF NOT EXISTS `mydb`.`TABLE_B` (
    `idTABLE_B` INT NOT NULL AUTO_INCREMENT , 
    `idTABLE_A` INT NOT NULL , 
    PRIMARY KEY (`idTABLE_B`) , 
    UNIQUE INDEX `idTABLE_B_UNIQUE` (`idTABLE_B` ASC) , 
    INDEX `idTABLE_A` (`idTABLE_A` ASC) , 
    CONSTRAINT `idTABLE_A` 
    FOREIGN KEY (`idTABLE_A`) 
    REFERENCES `mydb`.`TABLE_A` (`idTABLE_A`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB 

SQL script execution finished: statements: 8 succeeded, 1 failed 
+0

왜 역 따옴표의 식별자를 둘러싸되지 않습니다? –

+0

나는 결코 백틱을 사용하지 않는다. 예약어 나 공간을 원한다면 시간과 노력을 낭비한다. 그래서 예약어와 공백은 피한다. –

답변

1

이 일반적으로 일어날 것입니다. 여기 http://dev.mysql.com/doc/refman/5.0/en/innodb-error-codes.htmlhttp://forums.mysql.com/read.php?22,33999,76181#msg-76181

하지만 ... MySQL의 버그에 주석을 참조하십시오?

+0

안녕하세요, Joe, 답장을 보내 주셔서 감사합니다. 여기에 SQL 코드를 쓰지 않았습니다 ... 이것은 "Forward Engineer ..."를 사용하여 생성 된 방법입니다. 따라서 backticks를 사용하십시오. 방금 복사 한 후 붙여 넣었습니다. 그러나 "역행 (backticks)"은 내 게시물의 요점입니다. 여기서 흥미로운 점은 "id_"는 1005 오류를 생성하지 않으며 "id"를 사용하면 다른 모든 항목이 동일한 경우 1005 오류가 발생한다는 것입니다. 시도 해봐. –

+0

Hi Capsule, 그게 내가 생각하고있는 것 (즉, mysql 버그)이다. 왜냐하면 "id_"와 "id"를 제외한 나머지는 모두 동일하기 때문이다. 잠재적 인 mysql 버그를보고 할 수있는 중앙 집중식 장소가 있습니까? –

+0

http://bugs.mysql.com/이 장소입니다. – Capsule