MySQL. 테이블 errno 150을 만들 수 없습니다
-
20-09-2019 - |
문제
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
나를 위해 그것을 고쳤습니다.
항상 마스터/부모 테이블을 먼저 만들고 세부 사항/자식 테이블을 만듭니다.