我使用的是MySQL数据库。

在哪些情况下我应该创建唯一键或主键?


当前回答

我知道这个问题已经有好几年了,但我想提供一个答案,解释为什么而不是如何

主键的作用:在数据库中唯一地标识一行=>一行表示表建模的实体类型的单个实例。主键强制实体的完整性,即实体完整性。主键将是一个聚集索引,即它定义了数据在表中物理存储的顺序。

Purpose of Unique Key: Ok, with the Primary Key we have a way to uniquely identify a row. But I have a business need such that, another column/a set of columns should have unique values. Well, technically, given that this column(s) is unique, it can be a candidate to enforce entity integrity. But for all we know, this column can contain data originating from an external organization that I may have a doubt about being unique. I may not trust it to provide entity integrity. I just make it a unique key to fulfill my business requirement.

好了!

其他回答

主键是唯一的键。

每个表最多只能有一个主键,但可以有多个唯一键。主键用于唯一地标识表行。主键不能为NULL,因为NULL不是一个值。

主键的主要特征是:

它必须为每一行数据包含一个惟一的值。 不能包含空值。 一个表中只能有一个主键。

唯一键的主要特征是:

它还可以为每一行数据包含一个惟一的值。

它也可以包含空值。

一个表中有多个唯一键。

主键具有标识数据库行的语义。因此,一个给定的表只能有一个主键,而可以有许多唯一键。

同样的原因,主键不能为NULL(至少在Oracle中,其他数据库就不确定了)

因为它标识了行,所以它永远不应该更改。改变主键一定会造成严重的痛苦,甚至可能是永恒的诅咒。

因此,在大多数情况下,你需要一些人为的id作为主键,它只用于标识表中的单行。

另一方面,唯一键可以随心所欲地更改。

唯一键(英国):它是一列或一组列,可以识别一行中的唯一性。

主键(PK):它也是一列或一组列,可以识别一行中的唯一性。

因此,主键只是唯一键的另一个名称,但SQL Server中的默认实现对主键和唯一键是不同的。

默认情况下:

PK创建聚集索引,UK创建非聚集索引。 PK不为空,但是UK允许为空(注意:默认情况下) 一张桌子上只能有一个且只有一个PK,但可以有多个UK 您可以根据需要重写默认实现。

这取决于你在决定是创造UK还是PK时的目标是什么 “如果有三个人的团队,那么他们都是同行,但其中会有一个人是一对同行:PK和UK有类似的关系。”我建议阅读这篇文章:作者给出的例子可能看起来不太合适,但试着得到一个整体的想法。

http://tsqltips.blogspot.com/2012/06/difference-between-unique-key-and.html

Primary Key Unique Key
A primary key can't accept NULL values Unique key can accept NULL values, so problematic in the context of being unique
A primary key cannot contain duplicate values A unique key also cannot contain duplicate values
We can have only one primary key in a table We can have more than one unique key in a table
We can make a primary key from one or more table fields We can also make a unique key from one or more table fields
By default, a primary key creates a clustered index By default, a unique key creates a non-clustered unique index
It is used to identify each record in the table It prevents storing duplicate entries in a column