主键和身份之间有什么区别?

时间:2010-11-27 19:20:22

标签: sql-server database-design

在SQL Server数据库中,主键和标识列之间有什么区别?列可以是主键而不是缩进。但是,如果不是主键,则列不能是标识。

除了差异之外,PK和Identity列提供的只是PK列的内容不是什么?

编辑:哎呀。如下所述并且现在由我验证,列可以是身份而不是PK。当我测试这个时,我的列类型是一个字符串,我无法将其设置为标识。有道理。

7 个答案:

答案 0 :(得分:75)

一个列绝对可以是一个身份而不是PK。

身份只是一个自动增加列。

主键是定义行的唯一列。

这两个经常一起使用,但并不要求这样做。

答案 1 :(得分:12)

这个答案更多的是为什么身份和首要关键比他们是什么,因为乔正确回答了上面的内容。

标识是SQL控制的值。标识是一个行函数。它至少在SQL Server中是连续的值增加或减少。永远不应该修改它,并且应该忽略值中的间隙。标识值在将表B链接到表A时非常有用,因为该值永远不会重复。在每种情况下,标识都不是聚簇索引的最佳选择。如果一个表包含审计数据,那么聚集索引可能会更好地在发生的日期创建,因为它将显示“今天和四天之间发生的事情”的答案,而工作量较少,因为日期的记录是连续的。数据页。

主键使行中的一列或多列唯一。 Primay键是一个列函数。在任何表上只能定义一个主键,但可以创建模拟主键的多个唯一索引。对主键进行聚类并不总是正确的选择。考虑一下电话簿。如果电话簿按主键(电话号码)聚集,则返回“第一街”电话号码的查询将非常昂贵。

我遵循的身份和主键的一般规则是:

  1. 始终使用标识列
  2. 在范围查找中使用的一列或多列上创建聚簇索引
  3. 保持聚簇索引较窄,因为聚簇索引已添加到每个其他索引的末尾
  4. 创建主要密钥和唯一索引以拒绝重复值
  5. 窄键更好
  6. 为连接中使用的每个列创建索引
  7. 这些是我的一般规则。

答案 2 :(得分:8)

主键(也称为候选键)是具有唯一性和最小性属性的任何属性集。这意味着一个或多个关键列被限制为唯一的。换句话说,DBMS不允许任何两行具有这些属性的相同值集。

IDENTITY属性有效地为列创建自动递增的默认值。该列不必是唯一的,因此IDENTITY列不一定是键。

但是,IDENTITY列通常用作键,因此它通常具有唯一性约束,以确保不允许重复。

答案 3 :(得分:1)

基于反馈的编辑

键是行唯一的。这是一种识别行的方法。行可以没有,一个或几个键。这些键可能包含一列或多列。

键是具有唯一约束的索引。这将它们与非关键索引区分开来。

任何具有多列的索引都称为“复合索引”。

传统上,主键被视为唯一标识行的主键。可能只有其中一种。

根据表的设计,可能没有主键。

主键只是 - 一个“主键”。它是指定行的唯一标识的主要部分。根据表格的设计,这可能是用词不当,多个键表示唯一性。

在SQL Server中,可以对主键进行群集。这意味着剩余的列在索引的叶级附加到此键。换句话说,一旦SQL Server找到了密钥,它也会找到该行(很明显,这是因为 clustered 方面)。

标识列只是一种为行生成唯一ID的方法。

这两个经常一起使用,但这不是必需的。

答案 4 :(得分:0)

主键强调唯一性并避免同一列上所有记录的重复值,而标识在列中提供不断增加的数字而不插入数据。 这两个功能可以在一个列上,也可以在不同的列上。

答案 5 :(得分:0)

您不仅可以将IDENTITY用于整数,还可以将其用于任何比例为0的数值数据类型

主键可能具有比例但不是必需的。

IDENTITY与PRIMARY KEY或UNIQUE约束相结合,允许您提供简单的唯一行标识符

答案 6 :(得分:0)

主要和身份列之间的主要区别

主列:

  • 主键不能有重复的值。
  • 它为表创建聚簇索引。
  • 可以为任何列类型进行设置。
  • 我们需要在插入表格时提供主列值。

身份列:

  • “身份栏”可以有重复的值。
  • 只能为与integer相关的列(如int,bigint,smallint,tinyint或小数)设置该
  • 无需在标识列中插入值。它会根据种子自动插入。