저는 인터넷에서이 문제에 대한 해결책을 찾고 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-코드에 잘못된 기본 키 참조가 있습니다.
일반적으로 존재하지 않는 참조 된 외래 키 필드 때문입니다. 오타가 있거나 대 / 소문자를 동일하게 확인하거나 필드 유형이 일치하지 않을 수 있습니다. 외래 키 연결 필드는 정의와 정확히 일치해야합니다.
알려진 원인은 다음과 같습니다.
- 두 개의 키 필드 유형 및 / 또는 크기가 정확히 일치하지 않습니다. 예를 들어,
INT(10)
키 필드가 하나 인 경우 또는이INT(10)
아닌 이어야 합니다. 다음을 사용하여 필드 크기를 확인 할 수 있습니다 쿼리 브라우저 때로는 시각적으로 바로 보여줄 것이기 때문에 모두 와 . 또한 하나는 그렇지 않고 다른 하나는 . 둘 다 정확히 동일해야합니다.INT(11)
TINYINT
SHOW
CREATE
TABLE
INTEGER
INT(10)
INT(11)
SIGNED
UNSIGNED
- 참조하려는 키 필드 중 하나에 색인이 없거나 기본 키가 아닙니다. 관계의 필드 중 하나가 기본 키가 아닌 경우 해당 필드에 대한 인덱스를 만들어야합니다.
- 외래 키 이름은 이미 존재하는 키의 중복입니다. 외래 키의 이름이 데이터베이스 내에서 고유한지 확인하십시오. 이를 테스트하려면 키 이름 끝에 임의의 문자 몇 개를 추가하면됩니다.
- 테이블 중 하나 또는 둘 모두가
MyISAM
테이블입니다. 외래 키를 사용하려면 테이블이 모두InnoDB
. (실제로 두 테이블이 모두 있으면MyISAM
오류 메시지가 표시되지 않고 키가 생성되지 않습니다.) 쿼리 브라우저에서 테이블 유형을 지정할 수 있습니다. - 캐스케이드를 지정
ON
DELETE
SET
NULL
했지만 관련 키 필드가로 설정되어NOT
NULL
있습니다. 계단식을 변경하거나NULL
값 을 허용하도록 필드를 설정하여이 문제를 해결할 수 있습니다 . - Charset 및 Collate 옵션이 테이블 수준과 키 열의 개별 필드 수준에서 모두 동일한 지 확인합니다.
- 외래 키 열에 기본값 (즉, default = 0)이 있습니다.
- 관계의 필드 중 하나는 조합 (복합) 키의 일부이며 자체 개별 인덱스가 없습니다. 필드에 복합 키의 일부로 인덱스가 있더라도 제약 조건에서 사용하려면 해당 키 필드에 대해서만 별도의 인덱스를 만들어야합니다.
ALTER
문에 구문 오류가 있거나 관계에서 필드 이름 중 하나를 잘못 입력했습니다.- 외래 키 이름이 최대 길이 인 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
비슷한 문제가 있었기 때문에 시도한 몇 가지가 있습니다 (해결 방법을 제외하고는 순서가 아님 :))
- 외래 키 이름 변경 (작동하지 않음)
- 외래 키 길이 감소
- 데이터 유형을 확인했습니다 (잘못된 것은 아닙니다).
- 색인 확인
- 데이터 정렬을 확인하십시오 (모든 것이 괜찮아요, 다시 한번)
- 잘 사용되지 않는 테이블을 잘랐습니다.
- 테이블을 삭제하고 다시 생성
- 순환 참조가 생성되는지 확인하려고했습니다.
-
마지막으로 두 명의 편집자가 열려있는 것을 보았습니다. 하나는 PhpStorm (JetBrains)과 다른 MySQL 워크 벤치에 있습니다. PhpStorm / MySQL Workbench가 일종의 편집 잠금을 생성하는 것 같습니다.
잠금이 문제인지 확인하기 위해 PhpStorm을 닫았습니다 (다른 방법 일 수도 있음). 이것은 내 문제를 해결했습니다.
