主键和唯一键之间的区别


252

我正在使用mysql数据库。我对主键和唯一键之间感到困惑。

请帮助我在哪里创建主键和唯一键。我的意思是在哪种情况下我们创建唯一键或主键。


9
wrt null-ability区分黑白的好方法是 PRIMARY KEY = UNIQUE KEY + Not Null CONSTRAINT
KNU 2014年

Answers:


233

首要的关键:

  • 一个表中只能有一个主键
  • 在某些DBMS中不能这样NULL-例如MySQL添加NOT NULL
  • 主键是记录的唯一键标识符

唯一键:

  • 一个表中可以有多个唯一键
  • 唯一键可以有NULL
  • 可以是候选键
  • 唯一密钥可以NULL; 多个行可以具有NULL值,因此可能不被视为“唯一”

11
还想添加的主键可以在多个列上创建,例如主键(CustomerID,ProductID)。这称为复合主键。这是为了澄清第一个要点,因为它可能是新来的sql(读一个键=>一列):)
ken 2014年

1
您“可以成为候选密钥”是什么意思?

1
“仅允许单个null”-这是不正确的,至少对于MySQL来说不是。
贾尼斯·埃默里斯(JānisElmeris)

69
独特的按键可以为空并且可能不是唯一的手段
Pratik

20
@PratikCJoshi他可能意味着可以是多行,否则在唯一键上为null。
约翰

77

唯一键(UK):这是一列或一组列,可以标识一行中的唯一性。

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

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

默认:

  1. PK创建聚集索引,UK创建非聚集索引。
  2. PK不为空,但UK允许为空(注意:默认情况下)
  3. 一张桌子上只能有一个PK,但是英国可以有多个
  4. 您可以根据需要覆盖默认实现。

这实际上取决于您决定创建英国还是PK的目标。它遵循一个类似的比喻,“如果有一个由三个人组成的团队,那么他们都是同龄人,但是会有一个人将是一对同龄人:PK和UK具有相似的关系”。我建议阅读这篇文章:作者提供的示例似乎不太合适,但请尝试获得一个总体思路。

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


阅读大约10个网页,其中PK可以包含多个专栏。那桌上怎么可能只有一个PK呢?

@android关于唯一性,具有多列的PK充当单列。至少在PostgreSQL中,这意味着[table_name]_pkey将向表中添加一个新列(默认名称为)(我听说过这称为代理键)。来源:postgresqltutorial.com/postgresql-primary-key我是这一切的新手,所以我希望有一个知识渊博的海报来指出我错过的细微差别。
Poik

好的,这不是专栏。我看错了 这是一个约束,而不是专栏。仍然存在聚集索引,但是它超过了两列而不是一列。而且其中的每一列都不是自己的主键,而是整个集合都是主键。因此,在这些情况下,PK不超过一个。
Poik

46

对于组织或企业而言,有太多的物理实体(例如人,资源,机器等)和虚拟实体(其任务,交易,活动)。通常,业务需要记录和处理那些业务实体的信息。这些业务实体在整个业务域中由密钥标识。

根据RDBMS的预期,键(也称为候选键)是唯一标识实体的一个值或一组值。

对于数据库表,存在如此多的键,并且可能有资格使用主键。这样所有键,主键,唯一键等统称为候选键。但是,DBA从候选密钥中选择一个用于搜索记录的密钥称为“主密钥”。

主键和唯一键之间的区别

1.行为: 主键用于标识表中的行(记录),而唯一键用于防止列中的值重复(空条目除外)。

2.索引: 默认情况下,SQL引擎会在主键上创建聚簇索引(如果不存在),并在唯一键上创建非聚簇索引。

3.可空性主键不包含空值,而唯一键可以。

4.存在:一个表最多可以有一个主键,但是可以有多个唯一键。

5.可修改性:您不能更改或删除主值,但是唯一键值可以。

有关更多信息和示例:

http://dotnetauthorities.blogspot.in/2013/11/Microsoft-SQL-Server-Training-Online-Learning-Classes-Integrity-Constraints-PrimaryKey-Unique-Key_27.html


7
在第五点,您说我们不能更改或删除主值。我们肯定可以使用更新语句来更改表中的主要值。
卡皮尔2015年

3
@Kapil这样做超过了使用主键的全部目的。
Gokigooooks

2
聚集索引:行以与索引相同的顺序物理存储在磁盘上
Duy ng

26

主键必须是唯一的。

唯一键不必一定是主键,请参见候选键

也就是说,表上可能有多个列的组合可以唯一地标识行-只能选择其中的一个作为主键。其他(尽管唯一)是候选密钥。


17

主键和唯一键之间的区别

+-----------------------------------------+-----------------------------------------------+
|                Primary Key              |                    Unique Key                 |
+-----------------------------------------+-----------------------------------------------+
| Primary Key can't accept null values.   | Unique key can accept only one null value.    |
+-----------------------------------------+-----------------------------------------------+
| By default, Primary key is clustered    | By default, Unique key is a unique            |
| index and data in the database table is | non-clustered index.                          |
| physically organized in the sequence of |                                               |
| clustered index.                        |                                               |
+-----------------------------------------+-----------------------------------------------+
| We can have only one Primary key in a   | We can have more than one unique key in a     |
| table.                                  | table.                                        |
+-----------------------------------------+-----------------------------------------------+
| Primary key can be made foreign key     | In SQL Server, Unique key can be made foreign |
| into another table.                     | key into another table.                       |
+-----------------------------------------+-----------------------------------------------+

您可以从以下位置找到详细信息:http :
//www.dotnet-tricks.com/Tutorial/sqlserver/V2bS260912-Difference-between-Primary-Key-and-Unique-Key.html


16

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

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

由于它标识了该行,因此永远不应该更改。更改主键注定会导致严重的疼痛甚至可能永远的诅咒。

因此,在大多数情况下,您需要一些主键的人工ID,除了标识表中的单个行外,该ID不用于其他任何事情。

另一方面,唯一键可能会根据您的需要进行更改。


22
+1表示永恒的诅咒风险。现在是时候将神学引入关系数据库理论了。
内维尔·库伊特

PK在SQL Server中也不能为NULL
mrd3650

7

主键是唯一键。

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


6
  • 认为表名是雇员。
  • 首要的关键
  • 主键不能接受空值。主键强制列的唯一性。一个表中只能有一个主键。
  • 唯一键
  • 唯一键可以接受空值。唯一键还可以增强列的唯一性。您可以考虑如果唯一键包含空值,那么为什么它可以唯一?是的,尽管它可以接受空值,但它可以强制列的唯一性。只需查看图片即可。这里Emp_ID是主要的,公民ID是唯一的。希望你能理解。我们可以在一个表中使用多个唯一键。 在此处输入图片说明

1
我们不能在唯一键中插入多个空值,并且也不允许重复。
Masum '18 -4-9

@ mahedi-hasan唯一键列不是应该只有一个NULL值吗?公民ID为NULL的最后两行怎么办?我在这里想念什么吗?
超新星

刚刚得到我上面评论的答案。看起来MySQL允许唯一的多个NULL也看起来像@Mahedi_Hasan使用MySQL。 stackoverflow.com/questions/3712222/…–
超新星

6

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

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

唯一键的目的:好的,使用主键,我们可以唯一标识一行。但是我有一个业务需求,使得另一列/一组列应该具有唯一值。好吧,从技术上讲,鉴于此列是唯一的,因此它可以成为强制执行实体完整性的候选者。但是据我们所知,此列可能包含来自外部组织的数据,我可能会对它的独特性有所怀疑。我可能不信任它提供实体完整性。我只是将它作为满足我的业务需求的唯一钥匙。

你去!


1

如果您的数据库设计不需要外键,则可以使用唯一键(但请记住唯一键允许使用单个null值)。

如果您的数据库需要外键,那么您别无选择,必须使用主键。

要了解唯一键和主键之间的区别,请访问此处


1

唯一键:-当您必须提供唯一值时应使用它。如果是唯一键,则意味着还可以使用空值。唯一键是那些在该列中唯一且不相似的键,例如您的宠物名.it不能像null一样,如果您在数据库环境中进行查询,则必须注意,每个null与数据库中的另一个null都不相同。EXCEPT-SQL Server,其中null = null为true


主键:-当您必须唯一标识一行时应使用。主键是数据库约束中每行唯一的键,因为它不允许其中的空值。因此,您可能已经看到数据库有一个自动递增的列,它是表的主键。加上它可以作为另一个的外键。例如可以是订单表上的orderId帐单表中的billId

现在回到何时使用它的情况:-

1) 列中的主键不能在表中为空,并且您在另一个表中用作创建关系的外键

2)表格中的唯一键,它不会影响表格或整个数据库中的内容,无论您是否为餐厅中的零食(例如餐厅的零食)取特定列的空值,都可能不在餐厅中零食




0

主键

主键的主要目的是提供一种识别表中每个记录的方法。

主键提供了一种使用行中的数据标识行的方法。主键可以基于一个或多个列,例如名和姓;但是,在许多设计中,主键是从标识列自动生成的数字。

主键具有以下特征:

  1. 一个表只能有一个主键。
  2. 主键由一个或多个列组成。
  3. 主键可增强表的实体完整性。
  4. 所有定义的列必须定义为NOT NULL。
  5. 主键唯一地标识一行。
  6. 默认情况下,主键会导致CLUSTERED唯一索引。

唯一键

唯一键也称为唯一约束。可以使用唯一性约束来确保行在数据库中是唯一的。

我们不是已经用主键做到了吗?是的,是的,但是一个表可能有几组您想要唯一的列。

在SQL Server中,唯一键具有以下特征:

  1. 一个表上可以定义多个唯一键。
  2. 默认情况下,唯一键会导致NONCLUSTERED唯一索引。
  3. 一列或多列构成唯一键。
  4. 列可以为NULL,但是每列允许一个NULL。
  5. 外键约束可以引用唯一约束。

来源:这里


0

主键的主要功能是:

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

唯一键的主要功能是:

它也可以为每行数据包含一个唯一值。

它也可以包含空值。

一个表中的多个唯一键。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.