내가 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
왜 역 따옴표의 식별자를 둘러싸되지 않습니다? –
나는 결코 백틱을 사용하지 않는다. 예약어 나 공간을 원한다면 시간과 노력을 낭비한다. 그래서 예약어와 공백은 피한다. –