문제

MySQL에 두 개의 테이블이있는 데이터베이스를 만들어야하지만 Errno 150 (외래 키 문제)으로 스크립트가 실패합니다. 외국 키 필드를 두 테이블에서 동일하게 확인했으며 오류를 찾을 수 없습니다.

다음은 스크립트입니다.

 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';

 DROP SCHEMA IF EXISTS `testdb`;
 CREATE SCHEMA IF NOT EXISTS `testdb` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
 USE `testdb`;

 DROP TABLE IF EXISTS `testdb`.`table1` ;

 CREATE  TABLE IF NOT EXISTS `testdb`.`table1` (
   `id` INT UNSIGNED NOT NULL ,
   `field1` VARCHAR(50) NULL ,
   PRIMARY KEY (`id`) )

 ENGINE = InnoDB;


 DROP TABLE IF EXISTS `testdb`.`table2` ;

 CREATE  TABLE IF NOT EXISTS `testdb`.`table2` (
   `id` INT NOT NULL AUTO_INCREMENT ,
   `field1` VARCHAR(50) NULL ,
   `date` DATE NULL ,
   `cnt` INT NULL ,
   PRIMARY KEY (`id`) ,
   INDEX `FK_table2_table1` (`field1` ASC) ,
   CONSTRAINT `FK_table2_table1`
   FOREIGN KEY (`field1`)
   REFERENCES `testdb`.`table1` (`field1` )
   ON DELETE NO ACTION
   ON UPDATE NO ACTION)

 ENGINE = InnoDB;

 SET SQL_MODE=@OLD_SQL_MODE;
 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

MySQL 버전으로 Windows와 Ubuntu에서 시도했지만 작동하지 않았습니다.

어떤 아이디어?

도움이 되었습니까?

해결책

table1.field1 그것에 인덱스가 정의되어 있지 않습니다.

배치해야합니다 FOREIGN KEY 제약 field1.

이것으로 :

 CREATE  TABLE IF NOT EXISTS `testdb`.`table1` (
   `id` INT UNSIGNED NOT NULL ,
   `field1` VARCHAR(50) NULL ,
   KEY ix_table1_field1 (field1),
   PRIMARY KEY (`id`) )
 ENGINE = InnoDB;

그런 다음 모든 것이 예상대로 작동해야합니다.

다른 팁

MySQL Workbench 및 MySQL 5.5.27과 함께 작업하는 동안 비슷한 문제가 발생했습니다. 내 경우에는 INT 유형 필드에 문제가있었습니다. 하나의 테이블에서 잘못된 서명되지 않았으며 참조 테이블에서 int였습니다.

MySQL 버전에 따라 먼저 표 1.field1에서 색인을 만들어야 할 수도 있습니다.

여기서 답변 중 하나는 외국 키 무결성 점검을 비활성화하는 것을 제안합니다. 이것은 나쁜 생각입니다. 여기에는 두 가지 범인이 있습니다.

  • 참조 된 기본 키와 참조 외부 키 간의 데이터 유형 불일치
  • 지수. 색인이있는 모든 외국 키는 널 여야합니다.

또 다른 힌트 :

데이터 유형이 동일 해 보이더라도 - 내 경우에는 두 열 모두가 VARCHAR(50) - 충분하지 않다.

또한 두 열이 동일하도록해야합니다. COLLATION.

또 다른 원인은 다른 사람들과 약간 비슷하지만, 나는 Innodb 대신 Myisam 엔진을 가진 것으로 판명 된 테이블을 언급하고있었습니다.

MySQL은 또한 참조 테이블의 이름을 착각하면이 오류를 던질 것입니다. 나는 편지를 놓친 것을 깨달을 때까지 내 머리카락을 잠시 꺼 냈습니다. foreign key (column1) references mistyped_table(column1)

옵션 (사례에 따라)은 MySQL 무결성 점검을 비활성화하는 것입니다.

SET FOREIGN_KEY_CHECKS = 0;

아무것도 작동하지 않으면 이것을 시도하십시오.

외국 키 이름은 이미 존재하는 키의 복제품입니다. 외국 키의 이름이 데이터베이스 내에서 고유한지 확인하십시오. 키 이름 끝에 몇 개의 임의 문자를 추가하여 테스트하십시오.

제 경우에는 하나의 테이블이 아직 존재하지 않은 다른 테이블에 외국의 주요 제약 조건을 사용하고있었습니다. 이것은 큰 메이크 파일로 인해 발생 했으므로 예상했던 것만 큼 분명하지 않았습니다.

누군가가 여전히 문제가있는 경우, 위의 모든 솔루션을 시도했지만 (Set Foreign_key_checks 제외) 아무것도 작동하지 않았습니다. 문제는 첫 번째 테이블을 참조 할 때 일부 데이터베이스가 테이블 이름에 대해 사례에 민감하다는 것입니다. 나는 MySQL, Oracle에서 이것을 본 적이 없기 때문에 이것이 이상하다고 생각합니다. 이제 이것은 Mariadb에서 나에게 일어났습니다.

예를 들어:

존재하지 않으면 테이블 작성 Cadastro_Maquinas (ID Varchar (16), 1 차 키 (ID));

표시되지 않은 경우 테이블 작성 infos (ID_MAQUINA VARCHAR (16) NULL, 제약 조건 FK_INFOS_CADASTRO_MAQUINAS 외래 키 (ID_MAQUINA) 참조 CADASTRO_MAQUINAS (ID));

cadastro_maquinas 대신 cadastro_maquinas (하위 케이스)를 사용하여 두 번째 테이블을 만들려고하면이 오류가 발생합니다.

나는 사용하고 있었다 MySQL workBench. 문제는 동일하게 사용할 수 없다는 것입니다 foreign key name, 그들은 필요합니다 unique. 따라서 둘 이상의 테이블이 동일한 외국 키를 참조하면 매번 unique 주어진 이름.

테이블 중 하나에 비슷한 오류가있었습니다. 확인 된 열이 다르면 두 열을 동일한 콜레이션 유형으로 변경 한 후에 작동했습니다.

제안 된 솔루션의 대부분을 여기에서 읽은 후. 방금이 오류를 던질 수있는 모든 가능성을 나열하면 도움이 될 것이라고 생각했습니다.

1, 열 2의 확인 케이스, 열 3의 충전 체크 확인, 열에 대한 두 테이블 모두에 생성 된 키가 있는지 확인하십시오 (고유, 기본)

내 경우에는 테이블 중 하나에 오래된 테이블 정의 MyIsam을 얻었고 분명히 다른 테이블에서 외국 키를 만들 수 없었습니다. 어쩌면 이것은 누군가를 도울 것입니다.

따라서 두 데이터베이스/필드 정의 사이의 불일치로 인해 발생할 수 있습니다.

Field Type
Field Collation
Table Engine

나를 위해, 문제는 사용하는 것이 었습니다 CONSTRAINT 에서 CREATE TABLE 질문.

외국 키에서 복합 키를 참조하려고 할 때 동일한 오류가 발생할 수도 있습니다.

예를 들어:

CREATE TABLE `article` (
  `id` int(10) unsigned NOT NULL,
  `type` enum('X','Y','Z') NOT NULL,
  PRIMARY KEY (`id`,`type`)
) ENGINE InnoDB;

CREATE TABLE `t1` (
  `user_id` int(10) unsigned NOT NULL,
  `type` enum('X','Y','Z') NOT NULL,
  `article_id` int(10) unsigned NOT NULL,
  CONSTRAINT `user_access_article_ibfk_2` FOREIGN KEY (`article_id`, `type`) REFERENCES `article` (`id`, `type`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB

이 경우 기사 테이블 기본 키 정의에 나타나는 것과 동일한 순서로 FK 정의에서 article_id 및 유형 필드를 사용하는 것이 중요합니다.

제 경우에는 아마도 같은 이름의 테이블을 떨어 뜨리는 서버 버그 일 것입니다. 전체 shcema를 떨어 뜨리고 재창조하면 문제가 해결되었습니다.

매우 이상한 경우 데이터베이스가 깨질 수 있습니다. 제 경우에는 테이블에 외래 키가 없었으며 테이블의 이름을 바꾸거나 엔진을 변경하는 것이 도움이되었습니다.

Innodb가 깨 졌다는 것이 밝혀졌습니다. https://dba.stackexchange.com/questions/86853/1025-error-on-rename-of-table-errno-150-table-was-deleted-tried-to---------

MySQL Workbench에서 작업하고 관계 테이블에 대한이 오류가 발생하는 경우 빠른 수정이있을 수 있습니다. 삭제하고 MySQL Workbench를 재현하십시오. 그런 다음 SQL을 복사하십시오. 내 Errno 150 문제를 수정했습니다.

비 유니 키 필드를 참조하기 위해 외국 키를 사용하려고하는 동안이 오류가 발생했습니다. (어느 보기에 허용되지 않음)

이 문제가 있었을 때 첫 번째 테이블에서 ID를 설정했기 때문입니다. unsigned 두 번째 테이블의 외국 키는 그렇지 않았습니다. 둘 다 만들었습니다 unsigned 나를 위해 그것을 고쳤습니다.

항상 마스터/부모 테이블을 먼저 만들고 세부 사항/자식 테이블을 만듭니다.

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