2011-08-15 2 views
0

내 budget2000 테이블의 카테고리를 mainBudget의 카테고리에 대한 외래 키로 지정하려고합니다. 카테고리는 고유 번호가 아니므로 기본 키가 될 수 없습니다. 코드를 실행할 때 유명한 오류 1005가 발생합니다. ID가 mainBudget 인 기본 키의 범주 부분을 코드가 실행하면 코드가 실행되지만 나중에 문제가 발생합니다. 카테고리를 외래 키로 만들려면 어떻게해야합니까? 나는 mysql 5.5를 사용하고있다.외래 키에 문제가 있습니다

여기

create table mainBudget(
id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, 
year Year NOT NULL, 
amount double(10,2) NOT NULL, 
category SMALLINT UNSIGNED NOT NULL, 
primary key(id) 
)ENGINE=INNODB; 



create table budget2000(
id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, 
categories SMALLINT UNSIGNED NOT NULL, 
INDEX categoryNumber (categories), 
subCategory SMALLINT NOT NULL, 
amount FLOAT(10,2) NOT NULL, 
date DATE NOT NULL, 
description VARCHAR(300) NOT NULL, 
primary key(id), 
FOREIGN KEY (categories) REFERENCES mainBudget(category) 
)ENGINE=INNODB; 

답변

1

categorymainBudget에 인덱싱되지 않습니다 내 코드입니다. 참조 된 테이블의 열을 인덱싱해야합니다 (또는 인덱스의 왼쪽 접두사).

덧붙여 추가 테이블 category을 가지고 있고 mainBudget.categorybudget200.categories이 테이블의 외래 키를 가지고 있지 않은 것이 확실합니까? 현재 설정이 다소 이상하게 보입니다. 특히 mainBudget의 참조 된 열이 고유하지 않습니다.

+0

감사합니다. 카테고리 테이블에 대해서는 여분의 테이블에 가치가 있는지 알 수 없습니다. 단 8 개 카테고리가 있으며 PHP를 통해 전달되고 PHP로 하드 코딩됩니다. 사용자에게는 범주에 대한 드롭 다운 메뉴가 제공됩니다. – Aaron

0

고유하지 않은 열을 참조하는 FK는 표준 SQL이 아닙니다. MySQL InnoDB가 이것을 허용한다고해도 그것이 좋은 생각이라는 것을 의미하지는 않습니다.

일부 테이블을 ER-Diagramsnormalize으로 지정하십시오. (아무 것도하지 않으면 3.NF를 사용하십시오.) Category에 대한 별도의 테이블을 갖는 것이 길일 것 같습니다. 다른 한편으로는, 당신의 존재하는 테이블의 이름은 이것들이 단지 하나의 테이블이어야한다고 생각하게한다. 또는 그들의 명명은 나쁘다.

그리고이 2000이 1 년과 관련이 있거나 무엇을 잊었을 때. 검색어에서 쉽게 선택할 수 있습니다. 몇 년이든 상관없이 모든 것을 하나의 테이블에 넣으십시오.

귀하의 질문/문제는 저에게 관련되어있는 것 같습니다.