我正在尝试将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;
答案 0 :(得分:1)
category
未在mainBudget
中编入索引。必须索引引用表中的列(或索引的左前缀)。
顺便提一下,您确定要为此表添加一个额外的表category
并且mainBudget.category
和budget200.categories
这两个外键是不是更好?您当前的设置看起来有点奇怪,尤其是mainBudget
中引用的列不是唯一的。
答案 1 :(得分:0)
让FK引用非唯一列不是标准SQL。即使MySQL InnoDB允许这样做,也不意味着它是个好主意。
制作一些ER-Diagrams和normalize表格。 (如果没有别的东西强迫你不要这么做,请使用3.NF。)为Category
设置一个单独的表似乎是要走的路。另一方面,现有表的命名使我认为这些表应该只是一个表或者它们的命名是坏的。
当这个2000
与一年有关或什么然后忘记它时。您可以在查询中轻松选择此选项。无论什么年份,都把所有东西都放在一张桌子里。
您的问题/问题似乎与我的设计有关。