[mysql] 오류 코드 : 1005. ‘…’테이블을 만들 수 없습니다 (errno : 150).

저는 인터넷에서이 문제에 대한 해결책을 찾고 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



답변

오류 코드 : 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 테이블을 만들 수 없습니다를 참조하십시오.


답변

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

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

SET FOREIGN_KEY_CHECKS=0;

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


답변

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


답변

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

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


답변

비슷한 오류가 발생했습니다. 문제는 동일한 문자 집합과 데이터 정렬을 갖지 않는 자식 및 부모 테이블과 관련이 있습니다. 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 문에서 누락 된 코드가 있음을 의미합니다.


답변

외래 키는 참조하는 기본 키와 정확히 동일한 유형을 가져야합니다. 예를 들어 “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';


답변

오류 코드 : 1005

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

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

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