黑白主键和唯一键有什么区别

问题描述 投票:26回答:11

我试图在Google中找到它,但没有给出满意的答案。任何人都可以解释其实质性差异。

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

我何时应使用主键,何时应使用唯一键?

primary-key unique-key
11个回答
36
投票

主键和唯一键用于不同的事物-了解它们的用途将有助于您决定何时使用它们。

主键用于标识表中的一行数据。它在需要引用特定行时使用,例如。在其他表中或通过应用程序代码等。为了标识行,PK的值必须唯一。此外,它们不能为null,因为大多数DBMS将null视为不等于null(因为null通常表示“未知”)。一个表只能有一个PK。数据库中的所有表都应具有PK(尽管大多数DBMS都不强制执行),并且PK可以跨越多列。

唯一键约束用于确保数据库中的数据不会在两行中重复。数据库中的一行允许唯一键约束的值为null。尽管表应具有PK,但它不必具有任何其他唯一键。但是,如果表满足您的需求,则可以具有多个唯一键。像PK一样,唯一键可以跨越多列。

值得一提的是,默认情况下,许多DBMS索引和使用PK在磁盘上对表进行物理排序。这意味着通过它们的PK查找值比连续使用其他值更快。但是,通常,如果需要,您可以覆盖此行为。


11
投票

术语“唯一密钥”既含糊又互斥。在关系模型中,“键”表示候选键,根据定义,该键始终是唯一的。主键只是关系的任何候选键。因此,“唯一键”的含义与“候选键”的含义完全相同,而“候选键”的含义与“主键”完全相同。没有区别。

但是,SQL有一个称为UNIQUE约束的东西,它与SQL PRIMARY KEY约束有细微的区别-两者都强制唯一,但是PRIMARY KEY每个表只能使用一次。 UNIQUE约束也允许为空,而P​​RIMARY KEY约束则不允许。

因此,可能会引起混淆的术语“唯一密钥”通常用于表示由UNIQUE约束强制执行的密钥。它甚至可以用来表示对可空列的UNIQUE约束,尽管在我看来,这是一个非常可疑的用法,因为包含空值的一组列不能作为候选键,因此对可空列使用单词“ key”列不是真的正确,势必造成混乱。


9
投票

在讨论主键和唯一键之间的区别之前,重要的是确定什么是键,它如何在业务中发挥作用以及如何在SQL / Oracle中实现它等。

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

根据RDBMS预期:键(又称候选键),是唯一标识实体的一个值或一组值。对于Db表,存在如此多的键,并且可能有资格使用主键。这样所有的键,主键,唯一键等统称为候选键。

对于表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


4
投票

主键是唯一键。两种类型的键都可以唯一地标识表中的一行。由于一些不同的实现原因,许多RDBMS要求将表上的唯一键之一指定为“主键”。在数据完整性方面,没有区别。


4
投票

主键不允许为空,唯一键将允许为一个空(在SQL Server上为Oracle,而在Oracle上为多个null)一个表只能有一个主键,但可以有许多唯一键

要设置外键关系时使用主键

这是一个小示例,每个表中只有一列

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

消息547,级别16,状态0,第1行INSERT语句与FOREIGN KEY约束“ FK_ForeignTest_PrimaryTest”冲突。在数据库“ aspnetdb”的表“ dbo.PrimaryTest”的列“ id”中发生了冲突。该语句已终止。


2
投票

只需添加另一个示例:

考虑一个保存用户数据的表,其中每个用户都有一个电子邮件地址。没有两个用户可以使用相同的电子邮件地址,因此该列将成为唯一键。尽管它可以是主键(我从未将字符串作为主键),但也不一定是主键。


2
投票

[两者都代表表中一行的唯一标识,但几乎没有什么不同]

PRIMARY键不允许NULL值

while

唯一键仅允许一个NULL值。

这是主要区别..


1
投票

主键约束 1.主键不能为空。 2.不允许使用多个主键。 3.在某些RDBMS上,主键默认情况下会生成聚集索引。

唯一约束1.可以在允许空值的列上定义唯一约束。2.允许使用多个唯一键。3.在某些RDBMS上,唯一键默认情况下会生成非聚集索引。

来源维基百科


1
投票

NOT NULL表示该特定列中的任何条目都不应为null。唯一表示列中的每个条目都应该是不同的。PRIMARY KEY表示该列中的任何条目都应该是唯一的,并且不能为null。

很简单..

  PRIMARY KEY= UNIQUE + NOT NULL

0
投票

每个表可以有许多UNIQUE约束,但是每个表只有一个PRIMARY KEY约束。可以找到更多信息here


-1
投票

唯一键将与其他键一起使用,而主键则不与其他任何键一起使用。主键的使用没有任何其他键的关联。

© www.soinside.com 2019 - 2024. All rights reserved.