2011-08-15 13 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のための別のテーブルを持つことは行く方法のようです。一方、あなたの既存のテーブルの名前は、これらが1つのテーブルに過ぎないと思ったり、名前が悪いと思ったりします。

そして、この2000が1年と何か関係がある場合、またはそれを忘れた場合。クエリでこれを簡単に選択できます。年が何であっても、すべてを1つのテーブルに入れるだけです。

あなたの質問/問題は、私にとってデザイン関連のようです。

関連する問題