MySQL : FK 오류가있는 테이블 만들기 (Errno 150)
-
23-08-2019 - |
문제
나는 모델을 만들었습니다 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 외국 키 오류의 전체 목록은 다음 링크를 참조하십시오.
@Juacala의 답변을 확인했습니다. 그러나 나를 도와주지 않았습니다. 여기에 문제의 원인을 찾았을 때 @eliacom을 보낸 메시지는 다음과 같습니다. :
나는이 위대한 솔루션의 원천을 읽고 있었지만 내 문제는 놀랍지 않습니다. 나는 Myisam의 PK를 가리키는 InnoDB 테이블에 FK를 추가하려고했습니다. Myisam을 Innodb로 설정 한 후에는 효과가있었습니다. 나는 그것을 깨닫기 전에 당신의 전체 목록을 확인했습니다. 건배.
나는 같은 문제가 있었다. 어떻게 든 auto_increment 값을 테이블 ID에 설정하는 것을 눈치 채지 못했습니다. 어쩌면 그것은 누군가를 도울 수 있습니다.