更新时TSQL自动增量

时间:2011-06-28 19:26:03

标签: sql sql-server-2008 identity auto-increment

SQL Server 2008 +

我有一个带有自动增量列的表,我希望不仅可以在插入时增加,还可以更新。此列不是主键,但还有一个主键,它是通过newid()自动创建的GUID。

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

1。)删除现有行并插入一个带有缩进值的新行(加上任何更新)。

2.。)更新现有行并使用以下内容获取“下一个”标识值:

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

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

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

3 个答案:

答案 0 :(得分:4)

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

如果继续使用Identity列方法,您可能希望将逻辑放入UPDATE触发器,这将有效地将UPDATE替换为您所描述的INSERT和DELETE组合。

请注意,Identity列值不保证是连续的,只是增加。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

无法更新具有标识属性的列。一旦在其上具有标识属性的列被自动分配了值,或者在identity_insert开启时,它就是一个不变的值。此外,不能通过alter column禁用或删除身份属性。

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