0

私は、budget2000テーブルのカテゴリをmainBudgetのカテゴリの外部キーにしようとしています。カテゴリは一意の番号ではないため、主キーにすることはできません。コードを実行すると、有名なエラー1005が発生します。mainBudgetの主キーのカテゴリ部分をidで作成すると、コードが実行されますが、後で問題が発生します。カテゴリを外部キーにするにはどうすればよいですか。私はmysql5.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;
4

2 に答える 2

1

categoryでインデックス付けされていませんmainBudget。参照されるテーブルの列には、インデックスを付ける必要があります(またはインデックスの左側のプレフィックス)。

categoryちなみに、追加のテーブルを用意し、このテーブルへmainBudget.categorybudget200.categories両方の外部キーを用意する方がよいのではないでしょうか。現在の設定は少し奇妙に見えます。特に、参照されている列mainBudgetが一意ではない場合はそうです。

于 2011-08-15T16:25:30.483 に答える
0

一意でない列を参照するFKを持つことは、標準のSQLではありません。MySQL InnoDBでこれが許可されている場合でも、それが良い考えであるとは限りません。

いくつかのERダイアグラムを作成し、テーブルを正規化します。(他に何もしないように強制する場合は、3.NFを使用してください。)別のテーブルを用意Categoryするのが良い方法のようです。一方、既存のテーブルに名前を付けると、これらは1つのテーブルにすぎないか、名前が間違っていると思います。

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

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

于 2011-08-15T16:47:12.933 に答える