오류 코드 : 1005. '…'테이블을 만들 수 없습니다 (errno : 150).


103

저는 인터넷에서이 문제에 대한 해결책을 찾고 Stack Overflow 질문을 확인했지만 제 경우에는 어떤 해결책도 효과가 없었습니다.

sira_no 테이블에서 metal_kod로 외래 키를 만들고 싶습니다.

ALTER TABLE sira_no
    ADD CONSTRAINT METAL_KODU FOREIGN KEY(METAL_KODU)
    REFERENCES metal_kod(METAL_KODU)
    ON DELETE SET NULL
    ON UPDATE SET NULL ;

이 스크립트는 다음을 반환합니다.

Error Code: 1005. Can't create table 'ebs.#sql-f48_1a3' (errno: 150)

참조 된 테이블에 인덱스를 추가하려고했습니다.

CREATE INDEX METAL_KODU_INDEX ON metal_kod (METAL_KODU);

두 테이블 (charset 및 collation)에서 METAL_KODU를 확인했지만이 문제에 대한 해결책을 찾지 못했습니다. 이 문제를 어떻게 해결할 수 있습니까?

다음은 metal_kod 테이블입니다.

METAL_KODU    varchar(4)    NO    PRI
DURUM    bit(1)    NO
METAL_ISMI    varchar(30)    NO
AYAR_YOGUNLUK    smallint(6)    YES        100

metal_kod테이블 의 스키마를 표시 할 수 있습니까? 해당 테이블의 어떤 필드가 외래 키를 참조해야합니까?
Manse

답변:


271

오류 코드 : 1005-코드에 잘못된 기본 키 참조가 있습니다.

일반적으로 존재하지 않는 참조 된 외래 키 필드 때문입니다. 오타가 있거나 대 / 소문자를 동일하게 확인하거나 필드 유형이 일치하지 않을 수 있습니다. 외래 키 연결 필드는 정의와 정확히 일치해야합니다.

알려진 원인은 다음과 같습니다.

  1. 두 개의 키 필드 유형 및 / 또는 크기가 정확히 일치하지 않습니다. 예를 들어, INT(10)키 필드가 하나 인 경우 또는이 INT(10)아닌 이어야 합니다. 다음을 사용하여 필드 크기를 확인 할 수 있습니다 쿼리 브라우저 때로는 시각적으로 바로 보여줄 것이기 때문에 모두 와 . 또한 하나는 그렇지 않고 다른 하나는 . 둘 다 정확히 동일해야합니다.INT(11)TINYINTSHOW CREATE TABLEINTEGERINT(10)INT(11)SIGNEDUNSIGNED
  2. 참조하려는 키 필드 중 하나에 색인이 없거나 기본 키가 아닙니다. 관계의 필드 중 하나가 기본 키가 아닌 경우 해당 필드에 대한 인덱스를 만들어야합니다.
  3. 외래 키 이름은 이미 존재하는 키의 중복입니다. 외래 키의 이름이 데이터베이스 내에서 고유한지 확인하십시오. 이를 테스트하려면 키 이름 끝에 임의의 문자 몇 개를 추가하면됩니다.
  4. 테이블 중 하나 또는 둘 모두가 MyISAM테이블입니다. 외래 키를 사용하려면 테이블이 모두 InnoDB. (실제로 두 테이블이 모두 있으면 MyISAM오류 메시지가 표시되지 않고 키가 생성되지 않습니다.) 쿼리 브라우저에서 테이블 유형을 지정할 수 있습니다.
  5. 캐스케이드를 지정 ON DELETE SET NULL했지만 관련 키 필드가로 설정되어 NOT NULL있습니다. 계단식을 변경하거나 NULL값 을 허용하도록 필드를 설정하여이 문제를 해결할 수 있습니다 .
  6. Charset 및 Collate 옵션이 테이블 수준과 키 열의 개별 필드 수준에서 모두 동일한 지 확인합니다.
  7. 외래 키 열에 기본값 (즉, default = 0)이 있습니다.
  8. 관계의 필드 중 하나는 조합 (복합) 키의 일부이며 자체 개별 인덱스가 없습니다. 필드에 복합 키의 일부로 인덱스가 있더라도 제약 조건에서 사용하려면 해당 키 필드에 대해서만 별도의 인덱스를 만들어야합니다.
  9. ALTER문에 구문 오류가 있거나 관계에서 필드 이름 중 하나를 잘못 입력했습니다.
  10. 외래 키 이름이 최대 길이 인 64자를 초과합니다.

자세한 내용은 MySQL 오류 번호 1005 테이블을 만들 수 없습니다를 참조하십시오.


4
문제는 외래 키 문자 집합이 일치하지 않는다는 것입니다. 답변 해주셔서 감사합니다.
lamostreta

4
SHOW ENGINE INNODB STATUS에서 언급 한 바와 같이 이 질문에 (... 내 경우 PEBCAK) 내 특정 문제를 진단하는 데 도움
호보

1
젠장, 심지어 그것은 기본 키입니다. 해당 키에 대한 개별 색인을 만들어야합니다. 이것이 내 문제를 해결해 주셔서 감사합니다.
RSB

3
# 4는 내 문제였습니다. 테이블 중 하나는 MyISAM이고 스크립트는 InnoDB 테이블을 만들려고했습니다. 처음에 MySQL 5.0 또는 이와 유사한 버전을 실행하던 이전 시스템을 배포하려고 할 때이 문제가 발생했습니다. 여기서 기본 스토리지 엔진은 MyISAM이고 스크립트는 정상적으로 실행됩니다. 내 현재 환경은 5.5이고 기본 저장소는 InnoDB입니다. set names 'utf8', storage_engine=MYISAM;스크립트 시작 부분에 추가 하면 문제가 해결되었습니다. 정교한 답변에 대해 @ user319198 및 @Stefano에게 감사드립니다! : o)
Boris Chervenkov

1
제 1 번에서 언급 한대로 'unsigned'속성이 누락되었습니다. 감사합니다!
helvete 2015-06-18

11

이는 데이터베이스를 한 서버에서 다른 서버로 내보낼 때도 발생할 수 있으며 테이블은 기본적으로 알파벳 순서로 나열됩니다.
따라서 첫 번째 테이블에는 아직 생성되지 않은 다른 테이블의 외래 키가있을 수 있습니다. 이러한 경우 foreign_key_checks를 비활성화하고 데이터베이스를 생성하십시오.

스크립트에 다음을 추가하십시오.

SET FOREIGN_KEY_CHECKS=0;

그리고 그것은 작동합니다.


4

외래 키와 참조 키의 유형이 같거나 길이가 같지 않은 경우 매우 자주 발생합니다.


4

때로는 마스터 테이블이 삭제 되었기 때문에 (아마도 foreign_key_checks를 비활성화하여) 외부 키 CONSTRAINT가 여전히 다른 테이블에 존재합니다. 에서 경우에는 내가 테이블을 떨어하고 다시 시도,하지만 나를 위해 같은 오류를 던지고 있었다.

따라서 모든 테이블에서 모든 외래 키 CONSTRAINT를 삭제 한 다음 테이블을 업데이트하거나 생성하십시오.


2

비슷한 오류가 발생했습니다. 문제는 동일한 문자 집합과 데이터 정렬을 갖지 않는 자식 및 부모 테이블과 관련이 있습니다. ENGINE = InnoDB DEFAULT CHARACTER SET = utf8;

CREATE TABLE IF NOT EXISTS `country` (`id` INT(11) NOT NULL AUTO_INCREMENT,...) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8;

... SQL 문에서 누락 된 코드가 있음을 의미합니다.


2

외래 키는 참조하는 기본 키와 정확히 동일한 유형을 가져야합니다. 예를 들어 "INT UNSIGNED NOT NULL"유형의 경우 앞쪽 키도 "INT UNSIGNED NOT NULL"이어야합니다.

CREATE TABLE employees(
id_empl INT UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY(id)
);
CREATE TABLE offices(
id_office INT UNSIGNED NOT NULL AUTO_INCREMENT,
id_empl INT UNSIGNED NOT NULL,
PRIMARY KEY(id),
CONSTRAINT `constraint1` FOREIGN KEY (`id_empl`) REFERENCES `employees` (`id_empl`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='my offices';

서명되지 않은 것이 나에게 문제였습니다. 감사!
Gabo

2

오류 코드 : 1005

비슷한 문제가 있었기 때문에 시도한 몇 가지가 있습니다 (해결 방법을 제외하고는 순서가 아님 :))

  1. 외래 키 이름 변경 (작동하지 않음)
  2. 외래 키 길이 감소
  3. 데이터 유형을 확인했습니다 (잘못된 것은 아닙니다).
  4. 색인 확인
  5. 데이터 정렬을 확인하십시오 (모든 것이 괜찮아요, 다시 한번)
  6. 잘 사용되지 않는 테이블을 잘랐습니다.
  7. 테이블을 삭제하고 다시 생성
  8. 순환 참조가 생성되는지 확인하려고했습니다.
  9. 마지막으로 두 명의 편집자가 열려있는 것을 보았습니다. 하나는 PhpStorm (JetBrains)과 다른 MySQL 워크 벤치에 있습니다. PhpStorm / MySQL Workbench가 일종의 편집 잠금을 생성하는 것 같습니다.

    잠금이 문제인지 확인하기 위해 PhpStorm을 닫았습니다 (다른 방법 일 수도 있음). 이것은 내 문제를 해결했습니다.


2

나는 똑같은 오류 메시지를 가졌습니다. 마지막으로 명령에서 테이블 이름을 잘못 입력했음을 알았습니다.

ALTER TABLE `users` ADD FOREIGN KEY (country_id) REFERENCES country (id);

ALTER TABLE `users` ADD FOREIGN KEY (country_id) REFERENCES countries (id);

왜 지구상에서 MySQL이 그러한 테이블이 존재하지 않는다고 말할 수 없는지 궁금합니다.


1

MyISAM이 방금 언급되었습니다. 간단히 ENGINE = MyISAM DEFAULT CHARSET = latin1 AUTO_INCREMENT = 2; 다른 테이블이 MyISAM으로 생성되었다고 가정하고 명령문의 끝에서.

CREATE TABLE IF NOT EXISTS `tablename` (
  `key` bigint(20) NOT NULL AUTO_INCREMENT,
  FOREIGN KEY `key` (`key`) REFERENCES `othertable`(`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;

1

제 경우에는 한 테이블이 InnoB이고 다른 테이블이 MyISAM 일 때 발생했습니다. MySQL Workbench를 통해 한 테이블의 엔진을 변경하면 해결됩니다.


1

내 경우에는 제약 조건 선언에서 참조되는 테이블 이름이 올바르지 않기 때문에 발생했습니다 (테이블 이름에서 대문자를 잊었습니다).

ALTER TABLE `Window` ADD CONSTRAINT `Windows_ibfk_1` FOREIGN KEY (`WallId`) REFERENCES `Wall` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;

1

두 테이블에 동일한 스키마 InnoDB MyISAM이 있는지 확인하십시오. 내 경우 InnoDB에서 모두 동일하게 만들고 작업했습니다.


1

내 문제는 나열되지 않았습니다. 너무 어리석은 일이었습니다. ..... FKas PK가있는 테이블은 다음 과 같이 PK선언 된 합성물 이었습니다. 기본 키 ( CNPJ, CEP) CEP 필드가 FK다른 테이블 에 있기 를 원했고 이 오류에 갇혀 이야기의 교훈은 기본 키 ( CEP, CNPJ)에 대한 위의 코드를 뒤집었고 작동했습니다. 친구에게 팁을주세요.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.