【发布时间】:2021-05-14 18:27:01
【问题描述】:
我在工作台中创建了我的表,并通过前向设计来创建我的数据库。当我通过导出/转储备份我的数据库时,我遇到了一些 CREATE TABLE 的代码行,我不确定它们为什么看起来是这样的:
- 我的所有外键约束都有 CONSTRAINT-FOEIGN KEY()REFERENCES-(),这是有意义的。但我也有 KEY 似乎正在为我的一些外键创建索引,但不是为我的许多表中的所有外键创建索引。我不知道这条 KEY 行是做什么的,为什么会这样?在下面的示例中,我有 3 个 FK 中的 2 个的 KEY(其中一个 FK 是由 3 个组成的复合 FK)。
- 在 KEY 和 CONSTRAINT 之后,有时代码只提到外键名称,有时它的格式为 fk_referencingTable_referencedTable1。偶然在这个例子中,复合外键具有第二种格式,但实际上看起来任何外键(单个或复合)都可以随机具有这两种格式中的任何一种?为什么会这样?我应该对此感到担忧吗?
DROP TABLE IF EXISTS `Recommendations`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `Recommendations` (
`client_SIN` char(9) NOT NULL
`advisor_SIN` char(9) NOT NULL,
`exchange_name` varchar(45) NOT NULL,
`security_tradeName` varchar(45) NOT NULL,
`FSI_name` varchar(45) NOT NULL,
`Date` date DEFAULT NULL,
`Quantity` int(11) DEFAULT NULL,
PRIMARY KEY (`client_SIN`,`advisor_SIN`,`exchange_name`,`security_tradeName`,
`FSI_name`),
KEY `advisor_SIN_idx` (`advisor_SIN`),
KEY `fk_Recommendations_Exchanges_has_Securities1_idx`
(`exchange_name`,`security_tradeName`,`FSI_name`),
CONSTRAINT `advisor_SIN` FOREIGN KEY (`advisor_SIN`)
REFERENCES `Advisors` (`advisor_SIN`)
ON DELETE CASCADE ON UPDATE NO ACTION,
CONSTRAINT `client_SIN` FOREIGN KEY (`client_SIN`)
REFERENCES `Clients` (`client_SIN`)
ON DELETE CASCADE ON UPDATE NO ACTION,
CONSTRAINT `fk_Recommendations_Exchanges_has_Securities1`
FOREIGN KEY (`exchange_name`, `security_tradeName`, `FSI_name`)
REFERENCES `Exchanges_has_Securities` (`Exchanges_exchange_name`,
`Securities_security_tradeName`, `Securities_issuer_name`)
ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
【问题讨论】:
-
需要索引外键。创建外键时,会自动创建一个索引。当您转储表格时,这包括在内。
-
>>Barmer:但是和这个例子一样,Client FK在导出数据库的时候没有被索引,不知道为什么。
-
client_SIN是主键的第一列,所以它已经被索引了,不需要显式索引。 -
顺便说一句,使用
@username向某人发送评论,而不是>>username。它还提供了 TAB 键补全功能,因此您不会像这样拼错名称。 -
@Barmar 我手机上的 Tab 键在哪里??!
标签: mysql sql key constraints