KEY + Constraint mysql 5似乎重复了

时间:2015-01-05 17:53:03

标签: mysql

我使用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 */;

2 个答案:

答案 0 :(得分:0)

是的,您可以在没有键约束的情况下拥有约束,因此如果您不想要/不需要它们,您可以安全地删除键。

键和约束有不同的用途。

编辑:其实,让我纠正自己。在InnoDb中添加约束时,它总是自动编入索引,显示为键(它们是同义词)。您在show create table中看到的只是创建的索引。

答案 1 :(得分:0)

它们不是多余的。如果你添加一个没有密钥的外键,那么将为你隐式创建一个,但我个人更喜欢显式创建密钥,所以我可以选择它的名字。