主键和唯一约束之间的主要区别是什么?

What are the main differences between a primary key and a unique constraint?

我回答说表只有一个主键,但可以有许多唯一约束。 但还有什么?

主列永远不能为空,唯一列可以。

我能想到的一些差异:

  1. Primary Key 不能为 null,而 unique 将允许一个 null 值。
  2. 一个 table 上可以有多个唯一键,但只能有一个主键。

部分摘自维基百科 - Unique key - Differences from primary key constraints

主键约束

  1. A Primary Key cannot allow null(不能在允许空值的列上定义主键)。
  2. 每个table不能有一个以上的主键。
  3. 在某些 RDBMS 上,主键默认生成聚簇索引。

唯一约束

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

很难说面试官可能一直在寻找什么。有很多选择。

在标准 SQL 中,声明的约束 primary key 和声明的约束 not null unique 在逻辑级别 上的行为相同 。例如,这两者都可以成为外键引用的目标。面试官可能想知道 null 如何融入其中。裸 unique 约束允许空值;主键约束隐式声明 T-SQL.

中的每一列 not null

或者面试官可能一直在看你是否区分了独特的 constraint 和独特的 index。 AFAIK,每个 dbms 通过使用唯一索引来实现唯一约束。但是约束在逻辑层面上表达了数据库的一些东西,而唯一索引在物理层面上表达了数据库的一些东西。

SQL 特别是服务器

面试官可能想知道您是否知道某些计算列(但不是全部)可以被索引。 (那是一个远射。)

也许面试官想看看你能不能谈谈聚类。在 SQL 服务器中,主键约束默认为 clustered,但索引默认为 nonclustered

也许面试官想看看你是否会说任何关于权限的事情。添加约束通常需要比添加索引更广泛的权限。

UNIQUE 约束主键 之间的区别是每个table 你可能只有一个主键但您可以定义多个 UNIQUE 约束。主键约束是不可为空。 UNIQUE 约束可以是 nullable。 当您创建一个 UNIQUE 约束时,数据库会自动创建一个 UNIQUE 索引。对于 MS SQL 服务器数据库,PRIMARY KEY 将生成唯一的 CLUSTERED INDEX。 UNIQUE 约束将生成唯一的 NON-CLUSTERED INDEX。