MySQL - 为什么我不能将外键添加到指向一列的多个列?

时间:2014-04-12 10:57:43

标签: mysql foreign-keys

我有一个名为foodlist的表,其中包含食物:

CREATE TABLE `foodlist` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

示例数据:

id | name
1  | Apple
2  | Banana
3  | Cinnamon

然后我有一张你可以一起吃的食物组合表:

CREATE TABLE `foodlist-also_eat` (
  `originalFood` int(10) NOT NULL,
  `alsoFood` int(10) NOT NULL,
  PRIMARY KEY (`originalFood`,`alsoFood`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

这意味着,如果你可以吃香蕉苹果,那么条目就是:

originalFood | alsoFood
1              2

现在,我想要做的是在我的foodlist-also_eat表格中添加外键。

我可以为originalFood添加一个:

ALTER TABLE `foodlist-also_eat`
ADD FOREIGN KEY (`originalFood`) REFERENCES `foodlist` (`id`)
ON DELETE RESTRICT ON UPDATE RESTRICT;
  

查询确定。

但是,我无法继续为alsoFood添加一个:

ALTER TABLE `foodlist-also_eat`
ADD FOREIGN KEY (`alsoFood`) REFERENCES `foodlist` (`id`)
ON DELETE RESTRICT ON UPDATE RESTRICT;
  

源列和目标列必须具有相同的数据类型,目标列上必须有索引,并且必须存在引用的数据。   表' ./ dev @ 002dfood / foodlist @ 002dalso_eat'已存在

我在这里做错了什么?

1 个答案:

答案 0 :(得分:2)

根据Foreign key constraints

的文件
  

如果给出了CONSTRAINT符号子句,则符号值在数据库中必须是唯一的。如果没有给出该子句,InnoDB会自动创建名称。

     

请注意,从版本5.0.38开始,InnoDB允许列上有两个或更多外键,它们可能引用不同的表/列。它甚至允许具有相同定义但具有不同约束名称的外键。

为每个定义的约束定义唯一名称。

ALTER TABLE `foodlist-also_eat`
ADD constraint fk_of_flae 
    FOREIGN KEY (`originalFood`) 
    REFERENCES `foodlist` (`id`)
      ON DELETE RESTRICT ON UPDATE RESTRICT;

ALTER TABLE `foodlist-also_eat`
ADD constraint fk_af_flae 
    FOREIGN KEY (`alsoFood`) 
    REFERENCES `foodlist` (`id`)
      ON DELETE RESTRICT ON UPDATE RESTRICT;