b / w主键和唯一键有什么区别

时间:2010-06-04 10:52:51

标签: primary-key unique-key

我试图在谷歌中找到它,但没有给出令人满意的答案。任何人都可以解释这个坚实的差异。

实际上,如果主键用于唯一选择数据,那么Unique键的需求是什么?

我应该何时使用主键以及何时使用唯一键?

11 个答案:

答案 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。可修改性:您无法更改或删除主要值,但唯一键值可以。

有关示例的更多信息: http://dotnetauthorities.blogspot.in/2013/11/Microsoft-SQL-Server-Training-Online-Learning-Classes-Integrity-Constraints-PrimaryKey-Unique-Key_27.html

答案 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)

唯一密钥将与其他密钥一起提供,而主密钥不会与其他任何密钥一起提供。 使用主键时不会与任何其他键相关联。