主键和唯一键的区别

Posted

技术标签:

【中文标题】主键和唯一键的区别【英文标题】:difference between primary key and unique key 【发布时间】:2012-03-22 21:16:27 【问题描述】:

我正在使用 mysql 数据库。我在主键和唯一键之间有混淆。

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

【问题讨论】:

wrt null-ability 一种区分黑白的好方法是PRIMARY KEY = UNIQUE KEY + Not Null CONSTRAINT 看看dba.stackexchange.com/questions/15572/…。还有***.com/questions/1401572/… 【参考方案1】:

主键:

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

唯一密钥:

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

【讨论】:

还想在多列上创建主键,例如主键(客户 ID、产品 ID)。这称为复合主键。这是为了澄清第一点,因为它可能被新来的 sql 采用(读取一个键 => 一个列):) “可以成为候选键”是什么意思? "only single null is allowed" - 这不是真的,至少对于 MySQL 来说是这样。 唯一键可以为空,也可以不唯一意思 ?? @PratikCJoshi 他可能的意思是可以是多行,否则唯一键为空。【参考方案2】:

主键和唯一键的区别

+-----------------------------------------+-----------------------------------------------+
|                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.                       |
+-----------------------------------------+-----------------------------------------------+

【讨论】:

【参考方案3】:

主键和唯一键的区别

Primary keyUnique Key 都用于唯一定义表中的行。 Primary Key 创建列的 clustered index,而 Unique creates an unclustered index of the column

A Primary Key 不允许NULL value,但a Unique Key 允许one NULL value

【讨论】:

【参考方案4】:

主键的主要特征是:

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

唯一键的主要特点是:

它还可以包含每行数据的唯一值。

它也可以包含空值。

一个表中有多个唯一键。

【讨论】:

【参考方案5】:

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

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

唯一键的用途:好的,使用主键我们可以唯一标识一行。但我有一个业务需求,另一列/一组列应该具有唯一值。好吧,从技术上讲,鉴于此列是唯一的,它可以成为强制实体完整性的候选者。但据我们所知,此列可能包含来自外部组织的数据,我可能怀疑这些数据是否独一无二。我可能不相信它可以提供实体完整性。我只是让它成为满足我的业务需求的唯一关键。

你去!

【讨论】:

【参考方案6】:

唯一键:- 当你必须给出唯一值时应该使用它。在这种情况下 唯一键,这意味着也允许空值。唯一键是那些 在该列中唯一且不相似的键,例如 您的宠物名称。它可以与 null 完全不同,如果您在数据库上下文中询问,则必须注意每个 null 都与数据库中的另一个 null 不同。EXCEPT-SQL Server where null=null is true


主键:- 当您必须唯一标识一行时应该使用它。primary 是数据库约束中每一行的唯一键,它不允许在其中出现 null。所以,您可能已经看到数据库有一个列是自动增量,它是表的主键。另外它可以用作另一个表中的外键。示例可以是订单表中的orderId账单表中的billId

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

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

2) 表中的唯一键 无论您采用 null 对于特定列,例如餐厅中的小吃 可能你不在餐厅吃零食

【讨论】:

【参考方案7】:

主键

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

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

主键具有以下特征:

    一个表只能有一个主键。 主键由一列或多列组成。 主键强制表的实体完整性。 定义的所有列都必须定义为 NOT NULL。 主键唯一标识一行。 默认情况下,主键会产生 CLUSTERED 唯一索引。

唯一键

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

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

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

    一个表可以定义多个唯一键。 默认情况下,唯一键会产生非集群唯一索引。 一个或多个列组成一个唯一键。 列可以为 NULL,但每列允许有一个 NULL。 外键约束可以引用唯一约束。

来源:here

【讨论】:

【参考方案8】: 认为表名是employee。 主键 主键不能接受空值。主键强制 a 的唯一性 柱子。一个表中只能有一个主键。 唯一键 唯一键可以接受空值。唯一键还强制列的唯一性。您可以认为如果唯一键包含空值,那么为什么它可以是唯一的?是的,虽然它可以接受空值,但它强制列的唯一性。看看图片。这里 Emp_ID 是主要的,公民 ID 是唯一的。希望你能理解。我们可以在一个表中使用多个唯一键。

【讨论】:

我们不能在唯一键中插入多个空值,它也不允许重复。 @mahedi-hasan 唯一键列不应该只有一个 NULL 值吗? Citizen ID NULL 的最后两行怎么来的?我在这里错过了什么吗? 刚刚得到了我上面自己评论的答案。看起来 MySQL 也允许多个 NULL 唯一,所以看起来 @Mahedi_Hasan 使用了 MySQL。 ***.com/questions/3712222/… 是的..我想你明白了【参考方案9】:

对于一个组织或一个企业来说,有如此多的物理实体(如人、资源、机器等)和虚拟实体(他们的任务、事务、活动)。 通常,业务需要记录和处理这些业务实体的信息。 这些业务实体在整个业务领域内由一个 Key 标识。

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

对于一个 DB-Table,存在很多键并且可能符合主键的条件。 这样所有的键、主键、唯一键等统称为候选键。 但是,DBA 从候选键中选择一个键来搜索记录,称为主键。

主键和唯一键的区别

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

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

3. Nullability:主键不包含 Null 值,而 Unique-key 可以。

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

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

更多信息和示例:

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

【讨论】:

在第 5 点中,您说我们无法更改或删除主要值。我们当然可以使用更新语句来更改表中的主要值。 @Kapil 这样做超出了使用主键的全部目的。 聚集索引:行在磁盘上的物理存储顺序与索引相同【参考方案10】:

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

主键 (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

【讨论】:

阅读大约 10 个网页,也就是说,PK 可以包含多个列。那么一张桌子上怎么可能只有一个PK呢? @android 具有多个列的 PK 在唯一性方面充当单列。至少在 PostgreSQL 中,这意味着向表中添加了一个新列(默认名称为 [table_name]_pkey)(我听说这被称为代理键)。资料来源:postgresqltutorial.com/postgresql-primary-key我对这一切都很陌生,所以我希望能有一个知识渊博的海报指出我错过的细微差别。 好吧,这不是专栏。我看错了。这是一个约束,而不是一个列。仍然有聚集索引,但它超过两列而不是一列。并且其中的每一列本身都不是主键,而是整个集合都是主键。因此,在这些情况下,PK 不会超过一个。【参考方案11】:

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

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

要查看唯一键和主键之间的区别,请访问here

【讨论】:

可以从外键引用唯一约束。主键不是强制性的。【参考方案12】:

简单来说,主键是唯一的不能为空,唯一的可以为空,不能是唯一的。

【讨论】:

"unique 可以为 null 并且可能不是唯一的"。 may not be unique 在这里是什么意思?【参考方案13】:

主键必须是唯一的。

唯一键不一定是主键 - 请参阅 candidate key。

也就是说,一个表中可能有多个列组合可以唯一标识一行——其中只能选择一个作为主键。其他的,虽然是唯一的,但都是候选键。

【讨论】:

【参考方案14】:

主键是唯一键。

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

【讨论】:

【参考方案15】:

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

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

因为它标识了它永远不应该改变的行。更改主键必然会导致严重的痛苦,甚至可能是永恒的诅咒。

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

另一方面,唯一键可以随意更改。

【讨论】:

+1 提及永恒诅咒的风险。是时候将神学引入关系数据库理论了。 PK 在 SQL Server 中也不能为 NULL

以上是关于主键和唯一键的区别的主要内容,如果未能解决你的问题,请参考以下文章

主键、外键和索引的区别?

SQLServer主键和唯一约束的区别

主键和外键的区别:

SQL中主键和外键的定义是啥???

主键和外键的作用

请问SQL server 中的主键和外键的作用