我用这个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'?如果这是真的 - 我应该这样做吗?我的意思是,我为什么要说出外键?我会不会需要他们的名字?
谢谢! :)
答案 0 :(得分:2)
MySQL将KEY
解释为索引,因此第二个查询会在列other_id
上创建索引。
两个FK声明之间的区别在于您在第二行手动设置名称。在第一行中,MySQL自动设置名称 他们确实需要名字,但你不一定要注意它们。当查询引发错误时,一些更高级的RDBMS使用它们更明确。
答案 1 :(得分:2)
KEY
是INDEX
的同义词,因此就是在other_id
列上创建索引。
外键构造的唯一区别是后者constraint
版本允许您命名约束,而前者将被赋予系统生成的名称。
此名称可在INFORMATION_SCHEMA TABLE_CONSTRAINTS表格中看到。