【问题标题】:MySQL - will a primary key create one more index if the column is already indexed?MySQL - 如果列已经被索引,主键会创建一个更多的索引吗?
【发布时间】:2015-01-23 17:15:34
【问题描述】:

我有两个用于多语言文章的表格。在第一个表中,我没有文本列(id、authorid、date 等)。在第二个表中,我有文本列(标题、内容等)。

对于第一个表中的每一行,我可以在第二个表中有很多行。例如,对于翻译成三种语言的文章,我在表 2 中有三行。

在表 2 中,列 (id) 具有表 1 的外键,这就是它已经被索引的原因。我无法为表 2 设置唯一的列 ID,因为很明显它不是唯一的。但是,我不能像上面所说的那样在工作台中编辑表 2 中的数据 - 没有主键或非空唯一键。

我在方案中所说的:

Table1{
 id
 date
 authorId
}

Table2{
 id
 title
 content
 languageId
}

所以答案 - 如果我为表 2 中的列 (id) 创建主键 - mysql 会为该列再创建一个索引吗?

【问题讨论】:

  • 您可能应该有一个id 列以及一个table1ID 列(或类似名称),这实际上是您当前的id 列。然后,将id设为主键,将table1ID设为外键。
  • 索引与主键相关联,所以是的,添加主键会添加索引(在 InnoDB 中也会影响行的存储)。
  • 为什么你首先在第二个表中没有主键?只需为其添加一列。但是是的,它会添加一个索引——Another SO Question
  • 我不想在这里打开一罐关于 Surrogate vs Natural keys 的蠕虫...Table2 上的逻辑自然主键是来自 id 的复合键,任何列存储您的语言。这也将创建您的集群索引,因此如果 ID 是您的主键中的第一列,则所有搜索都将执行得很好。另一种方法是在您的第二个表中添加一个自动递增列,并将其作为主键,您的非聚集索引将保留在 ID 上,但我认为它需要重建。

标签: mysql sql mysql-workbench


【解决方案1】:

您不能在 Table2 中为 id 创建主键,因为此 id 不是唯一的,并且根据定义,主键必须是唯一的且不是 NULL。

但是,为了能够在工作台中编辑表 2 中的数据,我建议您使用 idlanguageId 字段在 Table2 上创建一个 composite primary key

ALTER TABLE table2 ADD PRIMARY KEY( id, languageId );

这里我假设idlanguageId 列一起唯一标识 Table2 中的一条记录。

【讨论】:

  • 然后可能会删除当前索引,因为 id 现在已被 PK 覆盖。
猜你喜欢
  • 2017-10-19
  • 2018-11-11
  • 2013-08-02
  • 2018-10-02
  • 2011-08-22
  • 1970-01-01
  • 2012-12-19
  • 2010-10-24
相关资源
最近更新 更多