使用或不使用查找表上的标识

时间:2015-04-24 13:27:21

标签: sql-server

在SQL Server中,我有以下查找表,其中包含学位级别:

ID

我应该在TaskStackBuilder上使用身份吗?

我应该何时在查找表中使用identity或简单的int?

5 个答案:

答案 0 :(得分:4)

在处理我们将更改从一个环境移动到下一个环境的多个环境后,我会说在查找表中使用标识列。

原因如下:如果您需要将ID引用为“魔术#”,则需要保持一致性。理想情况下,你不会引用魔术#,但实际上,这并不是常见的。当ID不同步时纠正是很痛苦的。使用ID插入表的数据真的不多。

答案 1 :(得分:3)

查询表中,有一个"正常" Id INT可能会更好,因为它使您能够选择Id值。您可以定义您拥有的值以及它们的含义。

Identity对于实际的数据表非常有用,您只需要知道自己拥有一个好的,唯一的ID值 - 但是您并不真正关心什么那个价值是。

答案 2 :(得分:1)

在任何表上的整数列上指定Identity属性时,该列将成为自动递增的整数列。如果希望查找表在插入任何行时自动创建id值,请使用identity。如果您想自己创建它,只需将列定义为int。

  • 一个表只能有一个标识列
  • 除非指定SET identity_insert on
  • ,否则无法在标识列中手动插入/更新值

答案 3 :(得分:1)

如果您要使用某些对象关系映射( ORM )工具,请参阅其文档。在这种情况下,您很可能希望允许 ORM 处理主键,而不应使用标识。

如果您对主键生成没有特定要求,那么在此处使用标识就可以了。具体要求可以是:主键遵循特殊格式,主键应该是全局唯一的,主键是从其他数据库导入的,例如, insert into DegreeLevel values (1, 'Bachelor')等。

答案 4 :(得分:1)

我想这取决于你是否有一个在聚集索引中使用的自然候选者...

如果您已经有一个可以唯一标识该行的属性,那么绝对值得考虑添加标识列是否正确。

如果你没有自然候选人,那么你需要发明一个值,在这种情况下,使用一个标识列或序列可能比手动滚动更容易。

作为拥有自然键的一个例子,想象一下程度模块'表格,其中每个模块都有一个4字符的参考代码,印在课程材料上(例如U212)

在这种情况下,我肯定会跳过创建内部标识符并使​​用自然标识符作为主键...

create table dbo.DegreeModule 
( 
    Reference char(4) not null primary key clustered,
    Name nvarchar(80) not null
       constraint UQ_DegreeModule_Name unique (Name)

    /* .. plus FK's for stuff like parent degree, prerequisites,etc .. */
)