我试图在谷歌中找到它,但没有给出令人满意的答案。任何人都可以解释这个坚实的差异。
实际上,如果主键用于唯一选择数据,那么Unique键的需求是什么?
我应该何时使用主键以及何时使用唯一键?
答案 0 :(得分:35)
主键和唯一键用于不同的事情 - 了解它们的用途将帮助您决定何时使用它们。
主键用于标识表中的一行数据。只要您需要引用特定行,就会使用它,例如。在其他表中或通过应用程序代码等。为了识别行,PK的值必须是唯一的。此外,它们不能为空,因为大多数dbms将null视为不等于null(因为null通常表示“未知”)。一张表只能有一个PK。数据库中的所有表都应该有PK(尽管大多数dbms不强制执行),PK可以跨多个列。
唯一键约束用于确保数据不会在数据库中的两行中重复。允许数据库中的一行为唯一键约束的值具有null。虽然表应该有PK,但它不需要任何其他唯一键。但是,如果满足您的需求,表可以有多个唯一键。与PK一样,唯一键可以跨越多列。
值得一提的是,默认情况下,使用PK的磁盘上有许多dbms索引和物理顺序表。这意味着通过PK查找值比使用行中的其他值更快。但是,通常情况下,您可以根据需要覆盖此行为。
答案 1 :(得分:11)
术语“唯一键”既模糊又同义。在关系模型中,“密钥”表示候选密钥,根据定义,无论如何都是唯一的。主键只是关系中的任何一个候选键。因此,“唯一密钥”意味着与“候选密钥”完全相同,这意味着与“主密钥”完全相同。没有区别。
但是,SQL有一种称为UNIQUE约束的东西,它与SQL PRIMARY KEY约束略有不同 - 两者都强制执行唯一性,但PRIMARY KEY只能在每个表中使用一次。 UNIQUE约束也允许空值,而PRIMARY KEY约束则不允许。
因此,可能令人困惑的术语“唯一键”通常用于表示由UNIQUE约束强制执行的键。它甚至可能用于表示对可空列的UNIQUE约束,尽管在我看来这是一个非常可疑的术语使用,因为包含空值的一组列不能成为候选键,因此使用单词“key”可以为空列不是真的正确,必然会引起混淆。
答案 2 :(得分:9)
在讨论主键和唯一键之间的区别之前,重要的是确定什么是键,它如何在业务中发挥作用以及如何在SQL / Oracle中实现。
根据业务预期: 对于组织或企业,有如此多的物理实体(例如人员,资源,机器等)和虚拟实体(他们的任务,交易,活动)。 通常,业务需要记录和处理这些业务实体的信息。 这些业务实体通过密钥在整个业务领域中进行标识。
根据RDBMS预期: 密钥(a.k.a Candidate Key),唯一标识实体的值或值集。对于Db表,存在许多密钥,并且可能符合主键的条件。 因此,所有密钥,主密钥,唯一密钥等统称为候选密钥。
对于表DBA选择的候选密钥称为主密钥,其他候选密钥称为辅助密钥。
主键和唯一键之间的差异
<强> 1。行为:主键用于标识表中的行(记录),而唯一键用于防止列中的重复值。
<强> 2。索引:默认情况下,如果主键不存在,则Sql-engine会在主键上创建聚簇索引,而在唯一键上会创建非聚簇索引。
第3。可为空性:主键不包含Null值,而Unique-key可以。
<强> 4。存在:一个表最多只能有一个主键,但可以有多个唯一键。
<强> 5。可修改性:您无法更改或删除主要值,但唯一键值可以。
答案 3 :(得分:4)
主键不允许空值,唯一键将允许一个空(在sql server上和Oracle上的多个空值) 一个表只能有一个主键,但有许多唯一键
当您想要设置外键关系时使用主键
这是一个小例子,每个表中只有一列
--primary key table
CREATE TABLE PrimaryTest (id INT PRIMARY KEY NOT NULL)
GO
-- foreign key table
CREATE TABLE ForeignTest (Pkid INT NOT NULL)
GO
--relationship
ALTER TABLE dbo.ForeignTest ADD CONSTRAINT
FK_ForeignTest_PrimaryTest FOREIGN KEY
(
Pkid
) REFERENCES dbo.PrimaryTest
(
id
) ON UPDATE NO ACTION
ON DELETE NO ACTION
GO
在主键表中插入一行
insert PrimaryTest values(1)
在外键表中插入一行,其中包含主键表中存在的值
insert ForeignTest values(1)
现在这将失败,因为主键表中不存在值2
insert ForeignTest values(2)
Msg 547,Level 16,State 0,Line 1 INSERT语句与FOREIGN KEY约束“FK_ForeignTest_PrimaryTest”冲突。冲突发生在数据库“aspnetdb”,表“dbo.PrimaryTest”,列“id”中。 声明已经终止。
答案 4 :(得分:4)
主键是唯一键。两种类型的密钥用于唯一标识表中的单个行。由于几种不同的实现原因,许多RDBMS要求将表中的一个唯一键指定为“主键”。在数据完整性方面,没有区别。
答案 5 :(得分:2)
只是添加另一个例子:
考虑一个包含用户数据的表,其中每个用户都有一个电子邮件地址。没有两个用户可以拥有相同的电子邮件地址,因此该列成为唯一键。虽然它可能是主键(我从来没有将字符串作为主键),但它不一定是。
答案 6 :(得分:2)
两者都表示表中行的唯一标识,但
有一点差别PRIMARY键不允许NULL值
而
UNIQUE键只允许一个NULL值。
这是主要的区别..
答案 7 :(得分:1)
主键约束
1.主键不能允许null
2.不允许使用多个主键
3.在某些RDBMS上,主键默认生成聚簇索引。
唯一约束
1.可以在允许空值的列上定义唯一约束
2.允许多个唯一键
3.在某些RDBMS上,默认情况下,唯一键会生成非聚簇索引。
来源维基百科
答案 8 :(得分:1)
NOT NULL表示该特定列中的任何条目都不应为null。 UNIQUE表示列中的每个条目都应该是不同的。 PRIMARY KEY表示列中的任何条目都应该是不同的,而不是null。
如此简单..
PRIMARY KEY= UNIQUE + NOT NULL
答案 9 :(得分:0)
每个表可以有许多UNIQUE约束,但每个表只有一个PRIMARY KEY约束。更多信息可以在here
找到答案 10 :(得分:-1)
唯一密钥将与其他密钥一起提供,而主密钥不会与其他任何密钥一起提供。 使用主键时不会与任何其他键相关联。