【问题标题】:What is difference between unique key with 'not null' constraint and primary key?具有“非空”约束的唯一键和主键有什么区别?
【发布时间】:2013-12-22 16:08:51
【问题描述】:

我想知道这两个键的区别。

当带有not null 的唯一键限制它们在数据库中的存储方式时

当我们对这些键进行Select,Insert,Update, Delete操作时有什么区别。

【问题讨论】:

标签: sql sql-server-2008


【解决方案1】:

主键必须是唯一且非空的,因此从这个角度来看它们是相同的。但是,一张表只能有一个主键,而您可以有多个唯一的非空键。

大多数系统还使用元数据单独标记主键,以便设计人员等识别它们。

就它们在数据库中的存储方式而言,主键和具有非空约束的唯一键有什么区别

如果两者都是CLUSTEREDNON CLUSTERED,那么唯一的区别是大多数系统中的元数据将索引标记为PK。

当我们对这些键进行Select,Insert,Update,Delete操作时有什么区别

无。

【讨论】:

  • @D Stanley sqlserver-2008 的数据库中主键和唯一键的存储方式有变化吗?
  • 我们可以在唯一键上应用自动增量吗?
  • @BhaveshKachhadiya 好吧,从技术上讲,您将它应用到 column,而不是 index,但是是的 - 你只能有一个 IDENTITY每个表的列。
【解决方案2】:

回答你的评论,是的!一般来说,唯一键和主键在 SQL Server 2008 中的存储方式存在巨大差异。

默认情况下(您可以更改它)将创建一个唯一键作为非聚集索引,而将创建一个 PK 作为聚集索引默认情况下(你也可以改变它)。

非集群意味着它将存储在“附加”到表的结构中并会占用磁盘空间。

聚集意味着记录实际上将按物理顺序存储,不消耗磁盘空间,这就是为什么您的表只能拥有一个聚集索引。 (如果您想知道......不,您不能在一个表中获得 2 个非集群 PK,即使它们是非集群的,PK 也是唯一的。)

【讨论】:

  • 还有一个巨大的不同。根据经验,使用聚集索引插入速度较慢,选择速度更快(您的里程可能会有所不同)。并且在 GUID 字段中使用聚集索引是一个坏主意,使用随机无序值会导致插入的表拆分。
  • @jean:我必须说,您在评论中所说的虽然可能是真的,但与原始问题相切,原始问题是关于主键和唯一约束之间的区别,而不是关于聚集索引和非聚集索引之间的区别。
  • @andriy-m 请参阅 cmets 的 OP 问题和我的回答。发生了关于唯一和 PK 之间差异的问题导致关于集群和非集群之间差异的问题,并且由于 OP 正在学习有关索引的基本概念并选择使用什么,我觉得评论这些事情很重要。也许 OP 可以提出另一个问题来阻止这种推导。
【解决方案3】:

主键不能为空,每张表只能有一个。

唯一键可以包含空值,并且每个表可以有多个。

【讨论】:

    【解决方案4】:

    一个。主键和唯一键都强制定义它们的列的唯一性。但默认情况下,主键在列上创建聚集索引,而唯一键默认创建非聚集索引。另一个主要区别是主键不允许 NULL,但唯一键只允许一个 NULL。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-20
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 2020-10-25
      相关资源
      最近更新 更多