Возникли проблемы с внешним ключом - PullRequest
0 голосов
/ 15 августа 2011

Я пытаюсь, чтобы категории в моей таблице 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;

Ответы [ 2 ]

1 голос
/ 15 августа 2011

category не индексируется в mainBudget. Столбец в указанной таблице должен быть проиндексирован (или левый префикс индекса).

Кстати, вы уверены, что не лучше иметь дополнительную таблицу category и иметь mainBudget.category и budget200.categories оба внешних ключа к этой таблице? Ваша текущая настройка выглядит немного странно, особенно если ссылочный столбец в mainBudget не является уникальным.

0 голосов
/ 15 августа 2011

Наличие FK, ссылающихся на неуникальные столбцы, не является стандартным SQL. Даже если MySQL InnoDB позволяет это, это не значит, что это хорошая идея.

Создайте ER-диаграммы и , чтобы нормализовать ваших таблиц. (Используйте 3.NF, если больше ничего не вынуждает вас делать это). Кажется, стоит использовать отдельную таблицу для Category. С другой стороны, из-за именования ваших существующих таблиц я думаю, что это должна быть только одна таблица, или их имена неверны.

И когда это 2000 имеет какое-то отношение к году или что потом забыть об этом. Вы можете выбрать это легко в ваших запросах. Просто поместите все в одну таблицу независимо от того, какой это год.

Ваш вопрос / проблема, похоже, связаны со мной.

...