我试图在谷歌中找到它,但没有给出令人满意的答案。任何人都可以解释坚实的区别。
实际上,如果主键用于唯一选择数据,那么唯一键需要什么?
什么时候应该使用主键,什么时候应该使用唯一键?
我试图在谷歌中找到它,但没有给出令人满意的答案。任何人都可以解释坚实的区别。
实际上,如果主键用于唯一选择数据,那么唯一键需要什么?
什么时候应该使用主键,什么时候应该使用唯一键?
主键和唯一键用于不同的事情 - 了解它们的用途将帮助您决定何时使用它们。
主键用于标识表中的一行数据。每当您需要引用特定行时使用它,例如。在其他表中或通过应用程序代码等。为了识别行,PK 的值必须是唯一的。此外,它们不能为 null,因为大多数 DBMS 将 null 视为不等于 null(因为 null 通常表示“未知”)。一张桌子只能有一个PK。数据库中的所有表都应该有一个 PK(尽管大多数 DBMS 不强制执行此操作),并且 PK 可以跨越多个列。
唯一键约束用于确保数据不会在数据库中的两行中重复。允许数据库中的一行对于唯一键约束的值具有空值。虽然一个表应该有一个 PK,但它不需要有任何额外的唯一键。但是,如果满足您的需要,表可以具有多个唯一键。与 PK 一样,唯一键可以跨越多个列。
还值得知道的是,默认情况下,许多 DBMS 索引和磁盘上的物理顺序表使用 PK。这意味着通过 PK 查找值比连续使用其他值更快。但是,通常,如果需要,您可以覆盖此行为。
术语“唯一键”既模棱两可又重复。在关系模型中,“键”表示候选键,根据定义,它无论如何都是唯一的。主键只是关系的任何一个候选键。因此,“唯一键”的含义与“候选键”的含义完全相同,“候选键”的含义与“主键”的含义完全相同。没有区别。
但是,SQL 有一个称为 UNIQUE 约束的东西,它与 SQL PRIMARY KEY 约束略有不同——两者都强制唯一性,但 PRIMARY KEY 每个表只能使用一次。UNIQUE 约束也允许空值,而 PRIMARY KEY 约束则不允许。
因此,可能令人困惑的术语“唯一键”最常用于表示由唯一约束强制执行的键。它甚至可以用来表示对可空列的唯一约束,尽管在我看来这是一个非常可疑的术语,因为一组包含空值的列不能作为候选键,所以使用“键”这个词来表示可空列并不真正正确,必然会引起混乱。
在讨论主键和唯一键之间的区别之前,重要的是要确定什么是键,它在业务中的作用以及它在 SQL / Oracle 中的实现方式等。
根据业务前景:对于组织或企业,有很多物理实体(如人员、资源、机器等)和虚拟实体(他们的任务、交易、活动)。通常,业务需要为这些业务实体记录和处理信息。这些业务实体在整个业务领域内由一个 Key 标识。
根据 RDBMS 的预期:键(又名候选键),唯一标识实体的一个值或一组值。对于 Db-Table,存在很多键并且可能符合主键的条件。这样所有的键、主键、唯一键等统称为候选键。
对于一个表,DBA 选择的候选键称为主键,其他候选键称为辅助键。
主键和唯一键的区别
1.行为: 主键用于标识表中的行(记录),而唯一键用于防止列中的重复值。
2. 索引: 默认情况下,如果主键不存在,Sql-engine 会在主键上创建聚集索引,在唯一键上创建非聚集索引。
3. Nullability:主键不包含 Null 值,而 Unique-key 可以。
4. 存在性:一张表最多可以有一个主键,但可以有多个唯一键。
5. 可修改性:您不能更改或删除主值,但唯一键值可以。
主键不允许空值,唯一键允许一个空值(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”中。该语句已终止。
主键是唯一键。两种类型的键都用于唯一标识表中的单行。由于几个不同的实现原因,许多 RDBMS 要求将表上的唯一键之一指定为“主键”。在数据完整性方面,没有区别。
只是添加另一个示例:
想象一个保存用户数据的表,其中每个用户都有一个电子邮件地址。没有两个用户可以拥有相同的电子邮件地址,因此该列成为唯一键。虽然它可能是主键(我从未将字符串作为主键),但它不一定是。
两者都代表表中行的唯一标识,但有一点区别是
PRIMARY 键不允许 NULL 值
尽管
UNIQUE 键只允许一个 NULL 值。
这是主要区别..
主键约束
1. 主键不能允许为空。
2. 不允许有多个主键。
3. 在某些 RDBMS 上,主键默认生成聚集索引。
唯一约束
1. 可以在允许空值的列上定义唯一约束。
2. 允许多个唯一键。
3. 在某些 RDBMS 上,唯一键默认生成非聚集索引。
来源维基百科
NOT NULL 表示该特定列中的任何条目都不应为空。UNIQUE 表示列中的每个条目都应该是不同的。PRIMARY KEY 表示列中的任何条目都应该是不同的并且不为空。
这么简单。。
PRIMARY KEY= UNIQUE + NOT NULL
每个表可以有许多 UNIQUE 约束,但每个表只能有一个 PRIMARY KEY 约束。更多信息可以在这里找到
唯一键将与其他键一起提供,而主键不与任何其他键一起提供。主键在没有任何其他键的任何关联的情况下使用。