26

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

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

什么时候应该使用主键,什么时候应该使用唯一键?

4

11 回答 11

36

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

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

唯一键约束用于确保数据不会在数据库中的两行中重复。允许数据库中的一行对于唯一键约束的值具有空值。虽然一个表应该有一个 PK,但它不需要有任何额外的唯一键。但是,如果满足您的需要,表可以具有多个唯一键。与 PK 一样,唯一键可以跨越多个列。

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

于 2010-06-04T11:17:19.613 回答
11

术语“唯一键”既模棱两可又重复。在关系模型中,“键”表示候选键,根据定义,它无论如何都是唯一的。主键只是关系的任何一个候选键。因此,“唯一键”的含义与“候选键”的含义完全相同,“候选键”的含义与“主键”的含义完全相同。没有区别。

但是,SQL 有一个称为 UNIQUE 约束的东西,它与 SQL PRIMARY KEY 约束略有不同——两者都强制唯一性,但 PRIMARY KEY 每个表只能使用一次。UNIQUE 约束也允许空值,而 PRIMARY KEY 约束则不允许。

因此,可能令人困惑的术语“唯一键”最常用于表示由唯一约束强制执行的键。它甚至可以用来表示对可空列的唯一约束,尽管在我看来这是一个非常可疑的术语,因为一组包含空值的列不能作为候选键,所以使用“键”这个词来表示可空列并不真正正确,必然会引起混乱。

于 2010-06-04T18:32:24.660 回答
9

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

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

根据 RDBMS 的预期:键(又名候选键),唯一标识实体的一个值或一组值。对于 Db-Table,存在很多键并且可能符合主键的条件。这样所有的键、主键、唯一键等统称为候选键。

对于一个表,DBA 选择的候选键称为主键,其他候选键称为辅助键。

主键和唯一键的区别

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

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

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

于 2014-01-10T06:33:56.157 回答
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)

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

于 2010-06-04T10:56:18.293 回答
4

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

于 2010-06-04T10:56:42.317 回答
2

只是添加另一个示例:

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

于 2010-06-04T18:38:55.567 回答
2

两者都代表表中行的唯一标识,但有一点区别是

PRIMARY 键不允许 NULL 值

尽管

UNIQUE 键只允许一个 NULL 值。

这是主要区别..

于 2013-09-17T06:32:48.483 回答
1

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

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

来源维基百科

于 2016-01-22T02:50:26.920 回答
1

NOT NULL 表示该特定列中的任何条目都不应为空。UNIQUE 表示列中的每个条目都应该是不同的。PRIMARY KEY 表示列中的任何条目都应该是不同的并且不为空。

这么简单。。

  PRIMARY KEY= UNIQUE + NOT NULL
于 2017-12-13T11:54:38.930 回答
0

每个表可以有许多 UNIQUE 约束,但每个表只能有一个 PRIMARY KEY 约束。更多信息可以在这里找到

于 2014-04-23T09:08:36.157 回答
-1

唯一键将与其他键一起提供,而主键不与任何其他键一起提供。主键在没有任何其他键的任何关联的情况下使用。

于 2015-03-25T02:25:11.713 回答