在SQL Server中,我有以下查找表,其中包含学位级别:
ID
我应该在TaskStackBuilder
上使用身份吗?
我应该何时在查找表中使用identity或简单的int?
答案 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 .. */
)