这两个SQL查询之间有什么区别?

时间:2011-10-27 20:18:34

标签: mysql sql foreign-keys relational-database

我用这个SQL查询创建了表地址:

CREATE TABLE `address` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `Street` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `Number` smallint(6) DEFAULT NULL,
  `other_id` bigint(20) NOT NULL,
  PRIMARY KEY (`id`),
  FOREIGN KEY (`other_id`) REFERENCES `other` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

但也有这个问题:

CREATE TABLE `address` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `Street` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `Number` smallint(6) DEFAULT NULL,
  `other_id` bigint(20) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `other_id` (`other_id`),
  CONSTRAINT `adress_ibfk_1` FOREIGN KEY (`other_id`) REFERENCES `other` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci$$

并且看来booth查询会创建相同的表格。

所以任何人都可以向我解释这一行是做什么的:

KEY `other_id` (`other_id`),

这两行之间有什么区别:

  FOREIGN KEY (`other_id`) REFERENCES `other` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
and
  CONSTRAINT `adress_ibfk_1` FOREIGN KEY (`other_id`) REFERENCES `other` (`id`) ON DELETE CASCADE ON UPDATE CASCADE

如果后两行之间的差异是后者给外键命名'adress_ibfk_1'?如果这是真的 - 我应该这样做吗?我的意思是,我为什么要说出外键?我会不会需要他们的名字?

谢谢! :)

2 个答案:

答案 0 :(得分:2)

MySQL将KEY解释为索引,因此第二个查询会在列other_id上创建索引。

两个FK声明之间的区别在于您在第二行手动设置名称。在第一行中,MySQL自动设置名称 他们确实需要名字,但你不一定要注意它们。当查询引发错误时,一些更高级的RDBMS使用它们更明确。

答案 1 :(得分:2)

KEYINDEX的同义词,因此就是在other_id列上创建索引。

外键构造的唯一区别是后者constraint版本允许您命名约束,而前者将被赋予系统生成的名称。

此名称可在INFORMATION_SCHEMA TABLE_CONSTRAINTS表格中看到。