【问题标题】:SQL: Create table with two indexesSQL:创建具有两个索引的表
【发布时间】:2016-08-03 10:54:28
【问题描述】:

我之前使用以下 SQL 代码创建了一个表:

CREATE TABLE myTable (
    id_A BIGINT NOT NULL,
    id_B INT NOT NULL,
    some_info varchar(255),
    some_info2 varchar(255),
    PRIMARY KEY (id_A) 
)

在之前创建的表中,id_A 和 id_B 都是唯一值。我了解 id_A 被强制为唯一 PRIMARY KEY (id_A) 代码,它是完美的(也索引它),但是 id_B 不是

这就是我感到困惑的地方。 id_B 也将是唯一的,但是我不确定如何强制它在表中唯一,以及如何使数据库为其创建索引,以便将来在此表上使用 SELECT 的查询将具有良好的性能。我知道我不能有两个主键:

PRIMARY KEY (id_A) 
PRIMARY KEY (id_B) 

我怎样才能为 id_B 建立索引,以便以后的查询高效地进行?

【问题讨论】:

  • 我相信 MySQL 有 UNIQUE 关键字可以放在数据类型之后。
  • 我建议你阅读主键。主键是行“标识符”,而不是索引。
  • @TuncayGöncüoğlu - 在 MySQL 中,PRIMARY KEY 是一个索引,它是唯一的,并且(对于 InnoDB)它与数据“聚集”在一起。
  • @RickJames 我知道。但是将它们视为索引会导致发布者犯的错误。在单列主键中没有关系,但是在多列主键中,正如所问的那样,区别很明显,即键作为一个整体是唯一的,并非每一列都是唯一的。这对于 MySQL 来说是正确的,对于所有其他 RDBMS 也是如此。因此我建议阅读主键。

标签: mysql sql indexing unique-constraint


【解决方案1】:

您可以在列上添加UNIQUE INDEX。虽然一张表只能有一个PRIMARY KEY,但它可以有尽可能多的UNIQUE INDEXes。

ALTER TABLE myTable
ADD UNIQUE INDEX `UI_myTable_idB` (`id_B` );

【讨论】:

  • 很好的答案! UI_myTable_idB 是否缺少下划线?成为:UI_myTable_id_B
  • 只是一个名字,有没有下划线无所谓。这只是我使用的命名约定('UI' + 不带下划线的表名 + 不带下划线的列名。您可以随意命名。
  • 哦,我明白了,所以它是创建的新索引的名称,括号中的内容是将代码链接到您希望索引的列。谢谢老哥!
  • 为什么有两个唯一的整数键?为什么不将其中一个设为PRIMARY KEY 并删除另一列?
【解决方案2】:

您可以对列使用 MySQL UNIQUE KEY。这将强制 id_B 列中的值是唯一的,但不将其用作主键列。你可以用这个语句来实现它:

CREATE TABLE myTable (
id_A BIGINT NOT NULL,
id_B INT NOT NULL,
some_info varchar(255),
some_info2 varchar(255),
PRIMARY KEY (id_A),
UNIQUE KEY (id_b))

这将自动为您希望的列建立索引。 MySQL表中的主键和唯一键本质上是一样的,只是主键不能为NULL,并且只能有一个主键列(或主键列的组合)。可以有任意数量的唯一键列。

【讨论】:

  • UNIQUE KEY (id_b) 不仅可以使列唯一,而且还可以索引它吗?还是我必须使用UNIQUE INDEX (id_b) 之类的行?
  • 在 MySQL 中键和索引本质上是同一个意思。所以不,您不需要指定UNIQUE INDEX (id_B)。通过使用UNIQUE KEY (id_B),MySQL 将为您进行索引。
  • 谢谢马特,我赞成你的帖子。如果我能接受(绿色检查)两个答案,我也会用绿色检查你的:)
猜你喜欢
  • 2022-11-23
  • 1970-01-01
  • 1970-01-01
  • 2020-06-28
  • 1970-01-01
  • 2015-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多