2009-07-24 4 views
35

MySQL 생성시이 오류가 발생합니다. 나는하고있다 :MySQL 오류 번호 121

CREATE TABLE `blogReply` (

    `Id`  INT(24)  NOT NULL AUTO_INCREMENT COMMENT 'Primary Key of This Table', 
    `blogId` INT(24)  NOT NULL COMMENT 'Blog where this reply was posted', 
    `userId` INT(24)  NULL COMMENT 'User the blog was posted by', 
    `name` VARCHAR(100) NULL DEFAULT 'Unknown' COMMENT 'The Name of the user that the reply was posted by', 
    `email` VARCHAR(100) NULL DEFAULT 'Unknown' COMMENT 'The Email of the user that the reply was posted by', 
    `http` VARCHAR(300) NULL DEFAULT 'Unknown' COMMENT 'The Webaddress of the user that the reply was posted by', 
    `message` TEXT   NOT NULL COMMENT 'text of the blog', 
    `votes` INT(10)  DEFAULT 0 COMMENT 'Rating of the Blog', 
    `ratedBy` TEXT   COMMENT 'People who have already Voted on this blog', 
    `dateReg` BIGINT  NOT NULL COMMENT 'Date the User was Registered', 

    PRIMARY KEY (`Id`), 

    CONSTRAINT `FK_userId` FOREIGN KEY(`userId`) 
     REFERENCES `user` (`Id`) 
     ON DELETE SET NULL 
     ON UPDATE CASCADE, 

    CONSTRAINT `FK_blogId` FOREIGN KEY(`blogId`) 
     REFERENCES `blog` (`Id`) 
     ON DELETE CASCADE 
     ON UPDATE CASCADE 

) ENGINE = InnoDB; 

어떤 생각? 오류 상태 : Can't create table './xxxxxxxx/blogReply.frm' (errno: 121)

답변

116

확인 참조 된 테이블 열과 함께 데이터 유형과 같은. 각 외부 키 이름은 작성된 테이블에 대해 고유해야하며 다른 테이블에 사용해서는 안됩니다. 위의 문제점에 대해 외부 키 이름 "FK_userId"는 다른 테이블에서 사용되어서는 안됩니다.

+0

그 이론을 테스트 해 봅시다. 이전에 다른 테이블에 FK_userId라는 이름이 붙어 있다고 생각합니다. –

+18

좋은, 외래 키가 필요하다는 것을 알지 못했습니다. 테이블을 통해 고유 한 이름을 가짐. 감사합니다 :) – Shade

+0

오늘 나는 몇 년 동안, 지금은 MySQL을 사용하여 처음 으로이 오류있어. 이름이 항상 일치하는 것은 우연의 일치였습니다. –

7

오류 121은 외래 키 제약 조건입니다. 첫 번째로 확인해야 할 것은 외래 키 정의가 괜찮습니다 (모든 테이블과 필드 이름이 올바른지 등).

당신은 같은뿐만 아니라 테이블을 작성하기 전에 외부 키 체크를 해제 시도 할 수

: 당신이 당신의 키 검사를 (1로 설정)을 다시 사용하도록 설정하면 나중에 오류를 던지는 단점을 가지고

SET FOREIGN_KEY_CHECKS = 0; 

그러나 이것이 사실 인 경우 외래 키의 생성을 방해하는 어딘가에 잘못된 레코드가 있음을 의미합니다.

그러나 실제로는 data/your_database_name 디렉터리의 이름을 바꾸는 등 데이터베이스 파일을 수동으로 이동 한 경우에도이 문제가 발생할 수 있습니다. InnoDB는 물리적 인 변화를 테이블 스페이스와 상관시킬 수 없기 때문에 내부와 충돌합니다.

가장 좋은 해결책은 이전 데이터베이스를 다시 원래 위치로 옮기고 덤프 또는 내보내기를 수행 한 다음 다시 가져 오기 전에 DROP DATABASE을 수행하는 것입니다. 모든 제약 조건이 정말 FK_userId 또는 FK_blogId

+1

아니 메신저하지 이동 thisgs 될 수 있습니다. 방금 설치 파일을 만들고 모든 테이블을 만들기 위해 새로운 복사본으로 다시 실행하십시오. –

1

작성중인 외국 키가 모든면에서 동일한 지 확인하십시오 제약 조건 이름을 사용하는 다른 테이블이 아니라고 확인도 올바르게 철자가

1

이 문제는 MySQL 5.5에서 발생하지만 mysql 5.6에서는 문제가 없습니다. 문제는 제약 조건 이름은 고유 보인다 때문이었다 그러나 이것은 긴 이름이며, 예를 들어, 비 고유하게 잘린 경우 :

long_constraint_name_1, long_constraint_name_2 주위 물리적 long_constraint_name_