主键和唯一键的区别
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 key
和Unique 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以上是关于主键和唯一键的区别的主要内容,如果未能解决你的问题,请参考以下文章