我使用phpMyAdmin快速创建数据库,然后通过sql手动添加约束。当我查看sql转储文件时,它具有以下内容(来自mysqldump)。对我而言,似乎没有必要同时拥有密钥和约束。
是否重复了KEY和CONSTRAINT?
DROP TABLE IF EXISTS `menu_item_option_ingredients`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `menu_item_option_ingredients` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`menu_item_option_id` int(11) NOT NULL,
`ingredient_id` int(11) NOT NULL,
`quanity` decimal(23,10) NOT NULL,
PRIMARY KEY (`id`),
KEY `menu_item_option_ingredients_ibfk_1` (`menu_item_option_id`),
KEY `menu_item_option_ingredients_ibfk_2` (`ingredient_id`),
CONSTRAINT `menu_item_option_ingredients_ibfk_2` FOREIGN KEY (`ingredient_id`) REFERENCES `ingredients` (`id`),
CONSTRAINT `menu_item_option_ingredients_ibfk_1` FOREIGN KEY (`menu_item_option_id`) REFERENCES `menu_item_options` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
答案 0 :(得分:0)
是的,您可以在没有键约束的情况下拥有约束,因此如果您不想要/不需要它们,您可以安全地删除键。
键和约束有不同的用途。
编辑:其实,让我纠正自己。在InnoDb中添加约束时,它总是自动编入索引,显示为键(它们是同义词)。您在show create table中看到的只是创建的索引。答案 1 :(得分:0)
它们不是多余的。如果你添加一个没有密钥的外键,那么将为你隐式创建一个,但我个人更喜欢显式创建密钥,所以我可以选择它的名字。