是否建议使用身份代替主键?


11

我们可以声明一个Identitylike,id_num这样id_num它将具有唯一编号的增量。

CREATE TABLE new_employees
(
  id_num int IDENTITY(1,1),
  fname varchar (20),
  minit char(1),
  lname varchar(30)
)

由于为每行提供了唯一的编号,因此建议使用它Identity作为替代方法吗?Primary keyIdentity


为什么需要这样做?因为最好是成为表中的一个主键,所以它会自动创建集群索引并有利于优化。
KuldipMCA

4
不,建议用IDENTITY 作主键(而不是PK的替代)。它提供了一个非常好,非常有效的主键(默认情况下,它也是SQL Server中的群集键)-狭窄,通常是静态的,通常是唯一的(除非您弄乱身份规范),而且它永远都是-增加
marc_s

Answers:


23

Identity columnsPrimary Keys是两个非常不同的东西。一个Identity column提供了一个自动递增的数字。这就是全部。将Primary Key(在SQL Server中至少)是一个独特的约束,保证唯一性和通常(但并不总是)聚集键。同样,在MS SQL Server中,它也是一个索引(在某些RDBMS中,它们没有紧密联系)。作为索引,它提供了更快的查找等。如果不存在商品,通常Identity columns被用作索引,但不能替代。Primary Keynatural key


1
在SQL Server中,非聚集索引在叶级别包含主键。将自然键指定为主键将使索引很大。
Andomar

2
@Andomar PK是逻辑实体。PK的支持指数是物理的。非聚集索引可以支持PK,而不必一定是聚集索引。因此,如果PK的索引是NCI,则您的陈述不正确。它是NCI的叶子级的聚集索引键。
Thomas Stringer

@ThomasStringer:没错,我的评论应该读到clustered index key它说的地方primary key
Andomar

可能吧 您的自然键可以是整数,在这种情况下没有区别。您将在“人工”键和“自然”键上看到的参数数量惊人。尝试在某个时间对其进行网络搜索:)恰好是人工密钥的参数之一。
肯尼斯·费舍尔

5

不,不是,因为身份不能保证唯一的价值。可以绕过identity属性SET IDENTITY_INSERT <schema>.<table> ON(在SQL Server中-您未指定要使用的RDBMS)。

主键约束(和唯一约束)使用唯一索引来强制唯一性。


5
它不能保证唯一的价值。但是没有别的。有权访问数据库的任何人都可以尝试将重复的值插入到主键中。身份的作用是使生成唯一值更容易(尤其是如果您没有肯尼思·费舍尔所说的良好自然键时)。您可以使用主键声明一个整数字段,这将是完全相同的事情,但是没有自动生成。因此,身份是生成的关键,而密钥是强制唯一性。
克里斯·奥尔德里奇

+1指出了问题的前提下,基本的缺陷- IdentityPrimary Key并不等同,有两个不同的目的。
JNK
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.