主键和唯一约束之间有什么区别?

Tim*_*Tim 39 sql primary-key

有人在接受采访时问我这个问题......

Håv*_*ard 55

主键不能为空.独特的钥匙可以.

  • +1这是至关重要的区别.这意味着主键中的列可以明确地对每一行进行寻址,但列唯一键不能(除非它们巧合地为NOT NULL). (7认同)

And*_*are 25

主键表上的唯一字段,但在表将该行视为其键时,它是特殊的.这意味着其他表可以使用此字段为自己创建外键关系.

唯一约束仅表示特定字段必须是唯一的.

  • 外键也可以引用唯一约束中的列. (15认同)
  • 主键是一组字段,不一定是单个字段. (12认同)
  • 唯一约束也可以应用于字段组合. (12认同)
  • 行的主键是数据库识别单个行的方式.它可以包含一个或多个列,它们一起也必须是唯一的. (10认同)
  • 它是旧的方形矩形规则.主键是唯一约束,但唯一约束不是主键.另外,如果唯一约束可以为null,则定义的PK不能为null. (7认同)

Gir*_*vil 12

  1. 主键不能为null,但唯一只能有一个空值.
  2. 主键自动创建集群索引但不是唯一键.
  3. 一个表只能有一个主键,但唯一键不止一个.

  • 关于SQL标准,你的第一点是不正确的,第二点与SQL标准无关(但两者都适用于SQL Server). (2认同)

one*_*hen 6

TL; DR可以暗示PRIMARY KEY(唯一性,可引用,非零,聚类等),但不能明确使用UNIQUE.

我建议如果你是那种喜欢方便的编码器SELECT * FROM...而不必列出所有那些讨厌的专栏,那么PRIMARY KEY对你来说就是这样.


一个relvar可以有几个键,但我们只选择一个用于下划线并将其称为主键.选择是任意的,因此从逻辑的角度来看,主要概念并不是非常重要.然而,关键的一般概念非常重要!术语候选键意味着与键完全相同(即,候选的添加没有实际意义 - 它是由Ted Codd提出的,因为他将每个键视为被提名为主键的候选者)... SQL允许要声明为该表的键的表的列的子集.它还允许其中一个被提名为主键.将密钥指定为主要密钥可以带来一些与可能需要的其他约束相关的便利性

什么是关键?休·达文


通常......将一个密钥单独输出作为主密钥(然后将所述relvar的任何其他密钥称为备用密钥).但是,是否一些关键是被选为主要的,如果是的话,哪一个基本上是心理问题,超出了关系模型的范围.作为一个良好的实践,大多数基础relvars可能应该有一个主键 - 但重复一下,这个规则,如果它是一个规则,实际上不是一个关系问题...强烈建议[对SQL用户] :对于基表,无论如何,使用PRIMARY KEY和/或UNIQUE规范来确保每个这样的表至少有一个密钥.

SQL和关系理论:如何 通过CJ Date 编写准确的SQL代码

在标准SQL中 PRIMARY KEY

  • 暗示唯一性,但您可以明确指定(使用UNIQUE).
  • 暗示NOT NULL但你可以在创建列时明确指定(但你无论如何都应该避免空值!)
  • 允许您在a中省略其列,FOREIGN KEY但您可以显式指定它们.
  • 每个表只能声明一个键,但不清楚为什么(最初提出这个概念的Codd没有强加这样的限制).

在某些产品中PRIMARY KEY隐含表的聚簇索引,但您可以明确指定(您可能不希望主键成为聚簇索引!)

对于一些人来说 PRIMARY KEY,纯粹具有心理意义:

  • 他们认为这意味着密钥将在外键中引用(这是由Codd提出的,但实际上并未被标准SQL和SQL供应商采用).
  • 他们认为它表示该表的唯一关键(但是未能强制执行其他候选密钥会导致数据完整性丢失).
  • 他们认为这意味着"代理"或"人为"密钥对业务没有任何意义(但实际上通过向用户公开对企业施加了不必要的重要性).