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;
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似乎是要走的路。另一方面,现有表格的命名让我认为这些应该只是一个表格,或者它们的命名不好。

当这2000与一年或什么有关时,就忘了它。您可以在查询中轻松选择此选项。不管是哪一年,只要把所有东西都放在一张桌子上。

您的问题/问题似乎与我的设计有关。

于 2011-08-15T16:47:12.933 回答