문제

나는 모델을 만들었습니다 MySQL 워크 벤치 그리고 현재 MySQL 서버에 설치하려고합니다.

사용 파일> 내보내기> 전방 엔지니어 SQL 스크립트 생성 ... 그것은 내가 요구하는 모든 설정과 함께 나에게 멋진 큰 파일을 출력합니다. 나는 전환한다 MySQL GUI 도구 (구체적으로 쿼리 브라우저) 및이 스크립트를로드합니다 (하나의 공식 MySQL 도구를 다른 공식 MySQL 도구를 형성 할 것입니다). 그러나 실제로이 파일을 실행하려고하면 동일한 오류가 계속됩니다.

sqlstate [hy000] : 일반 오류 : 1005는 테이블을 만들 수 없습니다 ./srs_dev/location.frm '(Errno : 150)

"OK", 나는 나 자신에게 말한다. 위치 테이블에 문제가있다. 그래서 출력 파일의 정의를 확인합니다.

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';

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

CREATE  TABLE IF NOT EXISTS `state` (
  `state_id` INT NOT NULL AUTO_INCREMENT ,
  `iso_3166_2_code` VARCHAR(2) NOT NULL ,
  `name` VARCHAR(60) NOT NULL ,
  PRIMARY KEY (`state_id`) )
ENGINE = InnoDB;

-- -----------------------------------------------------
-- Table `brand`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `brand` ;

CREATE  TABLE IF NOT EXISTS `brand` (
  `brand_id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
  `name` VARCHAR(45) NOT NULL ,
  `domain` VARCHAR(45) NOT NULL ,
  `manager_name` VARCHAR(100) NULL ,
  `manager_email` VARCHAR(255) NULL ,
  PRIMARY KEY (`brand_id`) )
ENGINE = InnoDB;

-- -----------------------------------------------------
-- Table `location`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `location` ;

CREATE  TABLE IF NOT EXISTS `location` (
  `location_id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
  `name` VARCHAR(255) NOT NULL ,
  `address_line_1` VARCHAR(255) NULL ,
  `address_line_2` VARCHAR(255) NULL ,
  `city` VARCHAR(100) NULL ,
  `state_id` TINYINT UNSIGNED NULL DEFAULT NULL ,
  `postal_code` VARCHAR(10) NULL ,
  `phone_number` VARCHAR(20) NULL ,
  `fax_number` VARCHAR(20) NULL ,
  `lat` DECIMAL(9,6) NOT NULL ,
  `lng` DECIMAL(9,6) NOT NULL ,
  `contact_url` VARCHAR(255) NULL ,
  `brand_id` TINYINT UNSIGNED NOT NULL ,
  `summer_hours` VARCHAR(255) NULL ,
  `winter_hours` VARCHAR(255) NULL ,
  `after_hours_emergency` VARCHAR(255) NULL ,
  `image_file_name` VARCHAR(100) NULL ,
  `manager_name` VARCHAR(100) NULL ,
  `manager_email` VARCHAR(255) NULL ,
  `created_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,
  PRIMARY KEY (`location_id`) ,
  CONSTRAINT `fk_location_state`
    FOREIGN KEY (`state_id` )
    REFERENCES `state` (`state_id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_location_brand`
    FOREIGN KEY (`brand_id` )
    REFERENCES `brand` (`brand_id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

CREATE INDEX `fk_location_state` ON `location` (`state_id` ASC) ;

CREATE INDEX `fk_location_brand` ON `location` (`brand_id` ASC) ;

CREATE INDEX `idx_lat` ON `location` (`lat` ASC) ;

CREATE INDEX `idx_lng` ON `location` (`lng` ASC) ;

나에게 괜찮아 보인다. 쿼리 브라우저에 뭔가 잘못되었다고 생각합니다. 그래서이 파일을 서버에 넣고이 방법으로로드하려고합니다.

] mysql -u admin -p -D dbname < path/to/create_file.sql

그리고 나는 같은 오류를 얻습니다. 그래서 나는이 문제를 Google에 시작하고 외국 키로 실패하는 InnoDB 스타일 테이블에 대한 오류에 대해 이야기하는 모든 종류의 계정을 찾습니다. 수정은 "set outsor avise_key_checks = 0"을 추가하는 것입니다. SQL 스크립트에. 보시다시피, 그것은 이미 MySQL Workbench가 튀어 나온 파일의 일부입니다.

그래서 내 질문은 내가해야한다고 생각하는 일을 할 때 왜 작동하지 않는가?

버전 정보 :

  • MySQL : 5.0.45

  • GUI 도구 : 1.2.17
  • 워크 벤치 : 5.0.30
도움이 되었습니까?

해결책

외국 키의 필드 유형은 참조하는 열의 유형과 동일해야합니다. 당신은 다음 (스니핑)이 있습니다 :

CREATE  TABLE IF NOT EXISTS `state` (
  `state_id` INT NOT NULL AUTO_INCREMENT ,
...
CREATE  TABLE IF NOT EXISTS `brand` (
  `brand_id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
...
CREATE  TABLE IF NOT EXISTS `location` (
...
  `state_id` TINYINT UNSIGNED NULL DEFAULT NULL ,
...
  `brand_id` TINYINT UNSIGNED NOT NULL ,

그래서 당신은 언급하려고합니다 INT 필드 (테이블에 state 그리고 brand) 와 함께 TINYINT 테이블의 필드 location. 나는 그것이 불평하는 오류라고 생각합니다. 처음에 어떻게 생겼는지 확실하지 않거나 왜 제로이 FOREIGN_KEY_CHECKS MySQL이 오류 진단을 중지하지는 않지만이 유형 불일치를 수정하면 어떻게됩니까?

다른 팁

이 스레드를보고있는 다른 사람들에게는이 오류를 얻을 수있는 많은 이유가 있습니다.

Errno 150, Errno 121 및 기타 MySQL 외국 키 오류의 전체 목록은 다음 링크를 참조하십시오.

MySQL 외국 키 오류 및 Errno 150

@Juacala의 답변을 확인했습니다. 그러나 나를 도와주지 않았습니다. 여기에 문제의 원인을 찾았을 때 @eliacom을 보낸 메시지는 다음과 같습니다. :

나는이 위대한 솔루션의 원천을 읽고 있었지만 내 문제는 놀랍지 않습니다. 나는 Myisam의 PK를 가리키는 InnoDB 테이블에 FK를 추가하려고했습니다. Myisam을 Innodb로 설정 한 후에는 효과가있었습니다. 나는 그것을 깨닫기 전에 당신의 전체 목록을 확인했습니다. 건배.

나는 같은 문제가 있었다. 어떻게 든 auto_increment 값을 테이블 ID에 설정하는 것을 눈치 채지 못했습니다. 어쩌면 그것은 누군가를 도울 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top