2011-06-28 95 views
3

SQL Server 2008+TSQL自动增量更新

我有一个自动增量列的表,我想增加不仅在插入而且更新。此列不是主键,但也有一个主键,它是通过newid()自动创建的GUID。

据我所知,有两种方法可以做到这一点。

1.)删除现有的行,并插入一个新的行与indentical值(加上任何更新)。

2)更新现有行并使用以下方法来获得“下一个”身份值:

IDENT_CURRENT('myTable') + IDENT_INCR('myTable') 

在任何情况下,我被迫允许身份插入。 (使用选项1,因为表的主键需要保持不变,并使用选项2,因为我正在使用特定值更新自动增量列。)我不确定锁定/性能的后果这是。

对此有何看法?有更好的方法吗?这里的目标是每当插入或更新行时在列中保持一组不断增加的整数值。

+0

尽管您可以“获取”特定表格的下一个Identity值,但通常不会帮助您,除了测试该值。尤其是,您无法将现有行的标识值更新为应该是“下一个”的标识值。您可以设法使用应用程序逻辑来序列化一个主键,但如果连续值由于性能命中而绝对需要,我只会这样做。如果感兴趣,我会在我的答案中添加一些内容。 – hardmath

回答

4

我认为rowversion (formerly known as "timestamp")类型的列可能是您最简单的选择,尽管在8字节这些可能相当大的整数。 “timestamp”语法不赞成使用rowversion(因为ISO SQL有时间戳数据类型)。

如果您仍然使用Identity列方法,那么您可能希望将您的逻辑放入UPDATE触发器,该触发器将有效地用您所描述的INSERT和DELETE组合替代UPDATE。

请注意,标识列值不保证是顺序的,只会增加。

+0

我已经研究过这个,但我不确定它在表格中保证是唯一的,并且始终递增。 (不要在意顺序,只要它总是增量。) 从您的描述来看,它不仅在表格中是唯一的,而且在整个数据库中也是如此。正确? – RMD

+0

这是一个很好的问题,数据库内的唯一性。我不得不依赖微软的文档,“rowversion”是一种数据类型,它公开自动生成的数据库中唯一的二进制数字...... rowversion数据类型只是一个递增的数字。“ – hardmath

2

它需要是一个整数列吗?时间戳列将为您提供开箱即用的功能。

2

具有标识属性的列无法更新。一旦具有身份属性的列被自动分配或赋值为identity_insert,它就是一个不变的值。此外,身份财产不得通过alter column被禁用或删除。

我相信你想看的是SQL Server TIMESTAMP(现在在SQL Server 2008中称为rowversion)。它基本上是一个自动递增的二进制值。每个数据库都有一个唯一的rowversion计数器。每行在具有时间戳/行转换列的表中插入/更新会导致计数器被勾起,并将新值分配给插入/修改的行。