timestamp (Transact-SQL) 时间戳
时间:2011-02-05 来源:steve.z
备注
每个数据库都有一个计数器,当对数据库中包含 timestamp 列的表执行插入或更新操作时,该计数器值就会增加。该计数器是数据库时间戳。这可以跟踪数据库内的相对时间,而不是时钟相关联的实际时间。一个表只能有一个 timestamp 列。每次修改或插入包含 timestamp 列的行时,就会在 timestamp 列中插入增量数据库时间戳值。这一属性使 timestamp 列不适合作为键使用,尤其是不能作为主键使用。对行的任何更新都会更改 timestamp 值,从而更改键值。如果该列属于主键,那么旧的键值将无效,进而引用该旧值的外键也将不再有效。如果该表在动态游标中引用,则所有更新均会更改游标中行的位置。如果该列属于索引键,则对数据行的所有更新还将导致索引更新。
使用某一行中的 timestamp 列可以很容易地确定该行中的任何值自上次读取以后是否发生了更改。如果对行进行了更改,就会更新该时间戳值。如果没有对行进行更改,则该时间戳值将与以前读取该行时的时间戳值一致。若要返回数据库的当前时间戳值,请使用 @@DBTS。
Transact-SQL timestamp 数据类型不同于在 SQL-2003 标准中定义的 timestamp 数据类型。SQL-2003 timestamp 数据类型等同于 Transact-SQL datetime 数据类型。
rowversion 的数据类型为 timestamp 数据类型的同义词,并具有数据类型同义词的行为。在 DDL 语句,请尽量使用 rowversion 而不是 timestamp。有关详细信息,请参阅 数据类型同义词 (Transact-SQL)。
在 CREATE TABLE 或 ALTER TABLE 语句中,不必为 timestamp 数据类型指定列名,例如:
复制代码 | |
---|---|
CREATE TABLE ExampleTable (PriKey int PRIMARY KEY, timestamp); |
如果不指定列名,则 Microsoft SQL Server 2005 数据库引擎将生成 timestamp 列名;但 rowversion 同义词不具有这样的行为。在使用 rowversion 时,必须指定列名。
注意: |
---|
在使用其中的 SELECT 列表中具有 timestamp 列的 SELECT INTO 语句时,可能会生成重复的时间戳值。建议不要以这种方式使用 timestamp。
|
不可为空的 timestamp 列在语义上等同于 binary(8) 列。可为空的 timestamp 列在语义上等同于 varbinary(8) 列。