【问题标题】:mySQL - KEY and FOREIGN KEY keywordsmySQL - KEY 和 FOREIGN KEY 关键字
【发布时间】:2021-05-14 18:27:01
【问题描述】:

我在工作台中创建了我的表,并通过前向设计来创建我的数据库。当我通过导出/转储备份我的数据库时,我遇到了一些 CREATE TABLE 的代码行,我不确定它们为什么看起来是这样的:

  1. 我的所有外键约束都有 CONSTRAINT-FOEIGN KEY()REFERENCES-(),这是有意义的。但我也有 KEY 似乎正在为我的一些外键创建索引,但不是为我的许多表中的所有外键创建索引。我不知道这条 KEY 行是做什么的,为什么会这样?在下面的示例中,我有 3 个 FK 中的 2 个的 KEY(其中一个 FK 是由 3 个组成的复合 FK)。
  2. 在 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


【解决方案1】:
  1. 创建外键会自动为 FK 中的列添加一个键,如果它还没有被索引的话。 client_SIN 没有额外的 KEY,因为它是主键中的第一列,复合索引的任何前缀都是它自己的索引。

  2. 我相信您获得的索引名称是由 MySQL Workbench 分配的。 MySQL 中的默认设置是在您没有显式命名索引时使用第一列名称作为索引名称。但它看起来像 MySQL Workbench 在创建索引时附加了_idx。如果它为外键创建索引,它也会使用前缀fk_

【讨论】:

    【解决方案2】:

    KEY 是用于创建索引的关键字语句(即它是子语句)。它创建一个索引,改变数据存储。

    FOREIGN KEY 是用于一致性检查子系统的关键字规则(是的,这是一个关键字,尽管它由两个单独的单词组成),并且不会导致数据存储本身发生任何变化。但它包含隐藏语句 - 首先检查引用表达式为前缀的索引是否存在,第二个如果检查失败则通过该表达式创建索引(即第二个隐藏语句是 KEY 语句)。 CONSTRAINTFOREIGN KEY 规则的命名部分(如果不存在则名称将自动生成)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-29
      • 2011-05-03
      • 2021-01-18
      • 1970-01-01
      • 1970-01-01
      • 2012-11-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多