SQL Server中timestamp(时间戳)

SQL Server timestamp 数据类型与时间和日期无关。SQL Server timestamp 是二进制数字,它代表数据库中数据修改发生的相对顺序。实现 timestamp 数据类型最初是为了支持 SQL Server 恢复算法。每次修改页时,都会使用当前的 @@DBTS 值对其作一次标记,而后 @@DBTS 加1。这样作足以帮助恢复过程肯定页修改的相对次序,可是 timestamp 值与时间没有任何关系。算法

@@DBTS 返回当前数据库最后使用的时间戳值。插入或更新包含 timestamp 列的行时,将产生一个新的时间戳值。数据库

 

select @@DBTS 设计

 

适用场景:索引

经过timestamp字段查询变动数据,假如上次保存的时间戳的值是:0x0000000000163E30,那么咱们经过下面的SQL脚本就能获取到这个时间戳以后变动的记录,获取到这里数据就能够更新内存数据了内存

 

注意事项:io

1. 每一个数据库都有一个计数器,当对数据库中包含 timestamp 列的表执行插入或更新操做时,该计数器值就会增长。 该计数器是数据库时间戳;select

2. 一个表只能有一个 timestamp 列;数据类型

3. 注意删除数据操做是没有办法记录时间戳的,因此你删除记录的逻辑应该是用一个字段标识这行记录已经被删除;二进制

4. 这一属性使 timestamp 列不适合做为键使用,尤为是不能做为主键使用;im

5. 若是该列属于索引键,则对数据行的全部更新还将致使索引更新;

6. 若要返回数据库的当前时间戳值:SELECT @@DBTS

7. 在 DDL 语句,请尽可能使用 rowversion 而不是 timestamp,在SSMS设计表的时候是没有rowversion数据类型的;

8. 在 CREATE TABLE 或 ALTER TABLE 语句中,没必要为 timestamp 数据类型指定列名,若是不指定列名,则 Microsoft SQL Server 数据库引擎将生成 timestamp 列名;但 rowversion 同义词不具备这样的行为。 在使用 rowversion 时,必须指定列名。

9. 不可为空的 rowversion 列在语义上等同于 binary(8) 列。 可为空的 rowversion 列在语义上等同于 varbinary(8) 列。