我有一个名为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'已存在
我在这里做错了什么?
答案 0 :(得分:2)
如果给出了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;