2011-08-15 126 views
0

我想讓我的budget2000表中的類別成爲mainBudget中類別的外鍵。類別不是唯一的編號,因此它不能是主鍵。當我運行代碼時,我得到了着名的錯誤1005.當我在mainBudget中使用id代碼運行時將主鍵的類別一部分,但是這會在稍後產生問題。我能做些什麼來使類別成爲外鍵。我使用的是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與一年有什麼關係或什麼都忘記了。您可以在查詢中選擇這個簡單的方法。只要把所有東西放在一張桌子上,不管它是哪一年。

您的問題似乎與我的設計有關。