2

我在 MySQL 的 1 个表下有 2 个唯一值。

|id (PK)|varchar(255) UNIQUE|
-----------------------------
|   1   |      1234abcde    |
|   2   |      5678fghij    |
|   3   |      9012klmno    |

我必须将 UNIQUE varchar 设置为 PK 还是我仍然可以使用 auto_incremented id (int)?这是一个好习惯还是坏习惯?

4

4 回答 4

6

不,它不必是主要的。初级是唯一的,但并非每个唯一都是初级。

于 2013-08-23T19:45:37.203 回答
2

一张表可以有多个键。其中一个是“主要的”(PRIMARY KEY),其余的是“替代的”(UNIQUE 约束)。

但请注意,在 InnoDB 下,主键也充当聚集索引,因此选择一个或另一个键作为主键可能会对性能产生深远的影响。

于 2013-08-23T19:52:18.340 回答
1

不,你不必。如果要确保varchar列中的唯一性,请设置唯一约束,但这并不意味着您需要将其设为 PK。您仍然可以使用数字自动递增 id 作为主键。

这种没有实际价值的数字主键称为代理键,建议使用它们,特别是在表中的搜索比插入多得多的情况下。它们对于提高查询性能非常有帮助,特别是在连接和搜索期间。

于 2013-08-23T19:46:11.300 回答
1

不,它不需要是主键。

此外:您不能拥有多个“主键”(不同于复合主键),并且对于单独的约定和某些框架(例如,像 Hibernate 和实体框架这样的 ORM)拥有一个自动递增的 id 字段通常是有意义的。

要回答您的第二个问题,在许多业务案例中,您对多个列强制执行唯一约束而不将它们设为主键 - 例如,它们可能必须是唯一的,但您可能需要能够编辑/更改它们:

IE

  1. 用户名的电子邮件地址 - 强制唯一,但用户可能需要更新它们
  2. 密码盐(如果你的一代是健全的,这不太可能需要强制执行)
  3. 用于生成一次性或时间敏感链接的随机字符串(想想 bit.ly)

所以,关键是一直在做。

于 2013-08-23T19:50:56.313 回答