2010-05-12 63 views
3

我的问题是我有一个SQL视图(MS SQL 2005),我正在映射到LINQ to SQL实体在C#更新触发器...@@标识是否返回主键或标识字段?

我的SQL看起来正确,但它抱怨试图将空值插入辅助表PK字段。

我相信我的问题涉及主键和身份作为主表中的单独字段。所以我的问题是这样的......当使用@@ identity时,它是查看插入行的主键,还是查看指定了“IDENTITY”的字段?

+0

为什么有人会有一个不是主键的标识字段?如果你有一个自然键,设置一个独特的undex,并使用身份提交作为PK。它将会提高性能并更新自然键(并且即使只是修正错字也会更新自然键),因为它们无需筛选所有子记录。 – HLGEM 2010-05-12 14:24:46

回答

12

@@IDENTITY只返回最后一个插入的标识值。它不知道该值是在主键列中使用还是即将对给定列唯一。而不是使用@@IDENTITY,您应该使用SCOPE_IDENTITY(),特别是如果您有触发器。 @@ IDENTITY只关心具有IDENTITY属性的列(在表中只能有一个)。表是否有主键以及PK是否为标识列没有区别。

查看SCOPE_IDENTITY了解更多。

+1

非常赞同,但即使没有触发器,也可以使用scope_identity,但您不知道什么时候有人可能会添加它们,也无法承担几乎无法修复的数据完整性错误。 – HLGEM 2010-05-12 14:23:04

+2

+1 @@ IDENTITY,是插入到任何作用域中的最后一个标识(从触发器内或任何地方插入,只是最后一个),SCOPE_IDENTITY()为您提供当前作用域中的最后一个作用域。 – 2010-05-12 14:28:05

2

你想用SELECT SCOPE_IDENTITY()代替@@Identity

0

@@ IDENTITY总是引用标识列,从来没有在表的主键。 (如果它是一个复合主键,那么它会如何工作?)正如Thomas所说,由于您正在使用触发器,因此您应该使用SCOPE_IDENTITY()。