SQL Server - 如何在更新时生成唯一的序列号

时间:2010-12-05 21:02:19

标签: sql-server sequence

我的表中有专栏,说updateStamp。我想在行更新时使用新的序列号来更新该字段。

数据库有很多流量,主要是读取,但多个并发更新也可以批量发生。因此,解决方案应该导致最小的锁定。

这个要求的原因是我需要有一个解决方案让客户端迭代表转发,如果一行更新 - 它应该再次出现在结果集上。

因此,查询就像

SELECT * 
FROM mytable 
WHERE updateStamp > @lastReturnedUpdateStamp 
ORDER BY updateStamp

不幸的是,时间戳在这里不起作用,因为多个更新可能同时发生。

1 个答案:

答案 0 :(得分:2)

{1}}(已弃用)或timestamp(当前)数据类型是我所知道的唯一一个在行上每次写入操作时都会更新的数据类型。

它本身不是时间戳 - 它不存储日期,时间,小时,秒等等 - 它实际上更多的是rowversion(因此名称更改) - 一个独特的,不断增加的数字行上的(二进制)。

它通常用于检查您读取行的时间与您要更新它的时间之间的任何修改。

由于它不是真正的日期/时间信息,因此您很可能必须为该人类可读信息设置另一列。您可以向表中添加RowVersion列,并使用LastModified DATETIME约束,可以在插入时插入新值。为了使其保持最新,您必须编写一个AFTER UPDATE触发器,以便在发生任何更新时更新DEFAULT GETDATE()列。

SQL Server 2011(又名“Denali”)将为我们带来SEQUENCES,这将非常适合您的情况 - 但是,唉,这仍然至少距官方发布一年..... / p>