【问题标题】:What's the difference between a Primary Key and Identity?主键和身份有什么区别?
【发布时间】:2010-11-27 19:20:21
【问题描述】:

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

除了差异之外,PK 和 Identity 列还提供哪些仅 PK 列不提供的功能?

【问题讨论】:

    标签: sql-server


    【解决方案1】:

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

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

    主键是定义行的唯一列。

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

    【讨论】:

    • 其实我相信SQL Server确实有要求,但其他数据库可能不会。
    • 我 99% 确定它没有,但无权访问实例来确认。
    • 然后粘贴到错误的create table中。这与作为 PK 的非身份列一起使用...创建表 pktest (nonpk int identity(1,1), pk int primary key not null)
    • +1 好答案。 PK 不需要是一个自动递增的数字,但它确实需要是每个条目的唯一值。要使用不是身份的 PK,可能需要先检查输入的任何新身份与表中已经存在的身份。
    • SQL Server 将拒绝主键的重复条目,这比我们编写的任何重复检查都要快。我们在代码中处理拒绝,因此实际上我们已经检查了重复条目。
    【解决方案2】:

    这个答案更多的是为什么身份和主键而不是它们是什么,因为乔已经正确回答了上面的问题。

    身份是您 SQL 控制的值。标识是一个行函数。至少在 SQL Server 中,它的值是按顺序递增或递减的。它不应该被修改,并且应该忽略值中的差距。标识值在将表 B 链接到表 A 时非常有用,因为该值永远不会重复。在每种情况下,标识都不是聚集索引的最佳选择。如果表包含审计数据,则可能最好在发生的日期创建聚集索引,因为它会以更少的工作来回答“今天和四天前之间发生了什么”这个问题,因为日期的记录在数据页。

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

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

    1. 始终使用标识列
    2. 在用于范围查找的一个或多个列上创建聚集索引
    3. 保持聚集索引范围窄,因为聚集索引被添加到每个其他索引的末尾
    4. 创建主键和唯一索引以拒绝重复值
    5. 窄键更好
    6. 为连接中使用的每一列或每列创建一个索引

    这些是我的一般规则。

    【讨论】:

    • 您提到身份值永远不会重复。如果手动插入或重新播种 (subhrosaha.wordpress.com/2012/11/14/…),它们可以被复制。如果您想保证唯一性约束,例如必须将唯一索引添加到 column/s。
    【解决方案3】:

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

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

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

    【讨论】:

    • 因此,在这种情况下,“身份”一词似乎有点用词不当,因为它并不总是唯一的,正如您所指出的,as have others。您的回答有助于那些对 MySql 更有经验的人通过强调它只是为列创建一个自动递增的默认值来更好地理解 Sql Server 的 Identity 属性,因此看起来类似于MySql's AUTO_INCREMENT property。谢谢。
    【解决方案4】:

    根据反馈进行的编辑

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

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

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

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

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

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

    在 SQL Server 中,主键可能是集群的。这意味着剩余的列在索引的叶级别附加到此键。换句话说,一旦 SQL Server 找到了键,它也找到了行(要清楚,这是因为 clustered 方面。

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

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

    【讨论】:

    • SQL Server 不要求主键是聚集索引。
    • @IanC :“它被称为 Primary 的原因是这是唯一标识行的键”。这并不是真正的解释,因为任何键或任何超键都唯一标识一行,而不仅仅是“主”键。 “主要”实际上只是表示“首选”或“特殊”键 - 尽管它只是您想要的特殊。
    • @IanC :危险在于,通过这种方式描述它,一个不知情的人可能会产生这样的印象,即表中可以或应该只有一个这样的键,这显然是不正确的。
    • @IanC :因为具有多个标识符的事物很常见,并且数据库的不同用户有时需要不同的密钥(例如,开发人员经常使用不同的密钥给最终用户)。原则上,所有候选键都可以提供相同的功能。所以说我们可以或必须只有一个主键,或者说主键在任何基本方面都是特殊的,并不是特别有意义。
    • 我说一个表可以有多个候选键。 Key 表示候选键,而“主”键(如果它意味着任何特殊的话)仅表示“候选键之一”。 SQL Server 与我所知道的所有 DBMS 一样,允许每个表有多个键。 SQL 为实现键提供了两个唯一性约束:PRIMARY KEY 和 UNIQUE(当然在不可为空的列上)。这两种关键约束都达到了完全相同的目的。
    【解决方案5】:

    您不仅可以将 IDENTITY 用于整数,还可以用于任何小数位数为 0 的数字数据类型

    主键可以有规模,但不是必需的。

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

    【讨论】:

      【解决方案6】:

      主列和标识列的主要区别

      主列:

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

      身份栏:

      • 标识列可以有重复值。
      • 只能为整数相关的列设置,如 int、bigint、smallint、tinyint 或 decimal
      • 无需在标识列中插入值。它会根据种子自动插入。

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          猜你喜欢
          • 2012-09-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-04-22
          • 2020-09-03
          • 2012-11-28
          • 1970-01-01
          相关资源
          最近更新 更多