【发布时间】:2010-11-27 19:20:21
【问题描述】:
在 SQL Server 数据库中,主键和标识列有什么区别?列可以是主键而不是缩进。但是,如果不是主键,列就不能是标识。
除了差异之外,PK 和 Identity 列还提供哪些仅 PK 列不提供的功能?
【问题讨论】:
标签: sql-server
在 SQL Server 数据库中,主键和标识列有什么区别?列可以是主键而不是缩进。但是,如果不是主键,列就不能是标识。
除了差异之外,PK 和 Identity 列还提供哪些仅 PK 列不提供的功能?
【问题讨论】:
标签: sql-server
一列绝对可以是一个身份而不是一个PK。
身份只是一个自动增加的列。
主键是定义行的唯一列。
这两个经常一起使用,但并不一定要这样。
【讨论】:
这个答案更多的是为什么身份和主键而不是它们是什么,因为乔已经正确回答了上面的问题。
身份是您 SQL 控制的值。标识是一个行函数。至少在 SQL Server 中,它的值是按顺序递增或递减的。它不应该被修改,并且应该忽略值中的差距。标识值在将表 B 链接到表 A 时非常有用,因为该值永远不会重复。在每种情况下,标识都不是聚集索引的最佳选择。如果表包含审计数据,则可能最好在发生的日期创建聚集索引,因为它会以更少的工作来回答“今天和四天前之间发生了什么”这个问题,因为日期的记录在数据页。
主键使行中的一列或多列是唯一的。 Primay key 是一个列函数。在任何表上只能定义一个主键,但可以创建多个唯一索引来模拟主键。对主键进行聚类并不总是正确的选择。考虑一个电话簿。如果电话簿由主键(电话号码)聚类,则返回“第一街”上的电话号码的查询将非常昂贵。
我对身份和主键遵循的一般规则是:
这些是我的一般规则。
【讨论】:
主键(也称为候选键)是具有唯一性和最小性属性的任何属性集。这意味着键列或列被限制为唯一。换句话说,DBMS 不允许任何两行的这些属性具有相同的一组值。
IDENTITY 属性有效地为列创建自动递增的默认值。不过,该列不必是唯一的,因此 IDENTITY 列不一定是键。
但是,IDENTITY 列通常旨在用作键,因此它通常具有唯一性约束以确保不允许重复。
【讨论】:
根据反馈进行的编辑
键对于一行是唯一的。这是一种识别行的方法。行可能没有、一个或多个键。这些键可能包含一列或多列。
键是具有唯一约束的索引。这将它们与非关键索引区分开来。
任何具有多列的索引都称为“复合索引”。
传统上,主键被视为唯一标识行的主键。可能只有其中之一。
根据表的设计,可能没有主键。
主键就是这样 - 一个“主键”。它是指定行的唯一标识的主要标识。根据表的设计,这可能是用词不当,多个键表示唯一性。
在 SQL Server 中,主键可能是集群的。这意味着剩余的列在索引的叶级别附加到此键。换句话说,一旦 SQL Server 找到了键,它也找到了行(要清楚,这是因为 clustered 方面。
标识列只是一种为行生成唯一 ID 的方法。
这两个经常一起使用,但这不是必需的。
【讨论】:
您不仅可以将 IDENTITY 用于整数,还可以用于任何小数位数为 0 的数字数据类型
主键可以有规模,但不是必需的。
IDENTITY 与 PRIMARY KEY 或 UNIQUE 约束相结合,可让您提供简单的唯一行标识符
【讨论】:
主列和标识列的主要区别
主列:
身份栏:
【讨论】:
主键强调唯一性并避免同一列上所有记录的重复值,而标识在不插入数据的情况下在列中提供增加的数字。 这两个特征可以在单个列上,也可以在不同的列上。
【讨论】: