2012-09-01 2 views
0

복합 기본 키를 사용하여 마스터 테이블을 만들었습니다. 다음과 같이복합 외래 키를 사용하여 테이블을 만드는 방법

부모 테이블 구조는 다음과 같습니다

CREATE TABLE `taskcategory` (
    `SiteID` int(10) unsigned NOT NULL DEFAULT 1, 
    `TaskID` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `TaskName` varchar(45) DEFAULT '', 
    `TaskDescription` varchar(45) DEFAULT '', 
    `IsInbuild` int(11) DEFAULT '1', 
    PRIMARY KEY (`TaskID`,`SiteID`) 
); 

내가 무엇입니까 위의 부모 테이블 참조하여 외래 키와 테이블을 만들려고하고 오류 '에는 150 테이블 오류를 만들 수 없다'. 내가 그 일을하도록 도와주세요.

자식 테이블 구조는 다음과 같이

CREATE TABLE taskdetails (`SiteID` int(10) unsigned NOT NULL DEFAULT '1', 
    `TaskID` int(10) unsigned NOT NULL DEFAULT '0', 
    `SubtaskID` int(10) unsigned NOT NULL, 
    `ScriptName` varchar(255) DEFAULT '', 
    `FunctionName` varchar(255) DEFAULT '', 
    `ButtonName` varchar(255) DEFAULT '', 
    `IsInbuild` int(10) unsigned DEFAULT '1', 
    `Description` varchar(255) DEFAULT '', 
    PRIMARY KEY (`SubtaskID`,`TaskID`,`SiteID`), 
          INDEX (siteid, taskid), 
          FOREIGN KEY (siteid, taskid) 
           REFERENCES taskcategory(siteid, taskid) 
           ON UPDATE CASCADE ON DELETE CASCADE 
          ) ENGINE=INNODB; 

도움이 내가 그것을 해결하기 위해.

+0

AFAIK 외래 키인 경우 열에 대해 인덱스를 가질 필요가 없습니다. –

+0

@niraj nawanit - 색인없이 시도했지만 동일한 오류가 발생했습니다. –

답변

1

:

외래 키 검사가 신속하고 테이블 스캔을 필요로하지 수 있도록 InnoDB하지만 외래 키와 참조 키에 대한 인덱스를 필요로한다. 참조 테이블에는 외부 키 열이 같은 순서로 첫 번째 열로 나열되는 인덱스가 있어야합니다. 이러한 색인은 이 없으면 참조하는 테이블에 자동으로 만들어집니다. 외래 키 제약 조건을 적용하는 데 사용할 수있는 또 다른 인덱스 을 작성하면이 인덱스가 나중에 자동으로 삭제 될 수 있습니다. index_name이 주어지면 앞에서 설명한대로 사용됩니다. 당신이 (예, 나는 그것을 테스트) 작동 부모 테이블에 인덱스를 추가 할 때

그래서 :

CREATE TABLE `taskcategory` (
    `SiteID` int(10) unsigned NOT NULL DEFAULT 1, 
    `TaskID` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `TaskName` varchar(45) DEFAULT '', 
    `TaskDescription` varchar(45) DEFAULT '', 
    `IsInbuild` int(11) DEFAULT '1', 
    PRIMARY KEY (`TaskID`,`SiteID`) 
    , INDEX (SiteID, TaskID) 
) ENGINE=INNODB; 

CREATE TABLE taskdetails (`SiteID` int(10) unsigned NOT NULL DEFAULT '1', 
    `TaskID` int(10) unsigned NOT NULL DEFAULT '0', 
    `SubtaskID` int(10) unsigned NOT NULL, 
    `ScriptName` varchar(255) DEFAULT '', 
    `FunctionName` varchar(255) DEFAULT '', 
    `ButtonName` varchar(255) DEFAULT '', 
    `IsInbuild` int(10) unsigned DEFAULT '1', 
    `Description` varchar(255) DEFAULT '', 
    PRIMARY KEY (`SubtaskID`,`TaskID`,`SiteID`) 
          ,INDEX (SiteID, TaskID) 
          ,FOREIGN KEY (SiteID, TaskID) 
           REFERENCES taskcategory(SiteID, TaskID) 
           ON UPDATE CASCADE ON DELETE CASCADE 
          ) ENGINE=INNODB; 

당신은 이미 그 컬럼에 대한 기본 키가 (이 암시 적 인덱스가 있다는 뜻) , 그러나 열의 순서는 중요하다!

+0

또한 리눅스를 사용하는 경우 대소 문자를 구분해야 할 수도 있습니다 – fancyPants

0

taskcategory의 테이블 정의에 ENGINE = InnoDB 절이 없기 때문에 시스템 기본값이 아닐 수도 있습니다. 외래 키 관계는 InnoDB 테이블간에 만 설정할 수 있습니다. manual에서

+0

이것은 오류를 발생시키지 않으며 모든 관계는 MyISAM에서 무시됩니다. – fancyPants

관련 문제