【问题标题】:Having trouble with foreign key外键有问题
【发布时间】:2011-08-15 16:19:21
【问题描述】:

我试图让我的 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;

【问题讨论】:

    标签: mysql foreign-keys mysql-error-1005


    【解决方案1】:

    category 未在 mainBudget 中编制索引。引用表中的列必须被索引(或索引的左前缀)。

    顺便说一句,您确定有一个额外的表category 并同时拥有该表的外键mainBudget.categorybudget200.categories 不是更好吗?您当前的设置看起来有点奇怪,尤其是 mainBudget 中引用的列不是唯一的。

    【讨论】:

    • 谢谢,至于类别表我不知道是否值得额外的表。只有 8 个类别,它们是通过 php 传入并在 php 中硬编码的。为用户提供了一个类别的下拉菜单。
    【解决方案2】:

    让 FK 引用非唯一列不是标准 SQL。即使 MySQL InnoDB 允许这样做,也并不意味着这是一个好主意。

    制作一些 ER-Diagramsnormalize 你的桌子。 (如果没有其他强制您不这样做,请使用 3.NF。)为Category 设置一个单独的表似乎是要走的路。另一方面,现有表的命名让我认为这些应该只是一个表,否则它们的命名是错误的。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-25
      • 2020-03-16
      • 2011-02-01
      • 2011-04-13
      • 2016-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多