timestamp有什么用?

联机丛书:
timestamp
timestamp  这种数据类型表现自动生成的二进制数,确保这些数在数据库中是唯一的。 timestamp  一般用作给表行加版本戳的机制。存储大小为 8 字节。
 
注释
Transact-SQL  timestamp  数据类型与在 SQL-92 标准中定义的  timestamp  数据类型不同。SQL-92  timestamp  数据类型等价于 Transact-SQL datetime 数据类型。 
 
Microsoft® SQL Server™ 将来的版本可能会修改 Transact-SQL  timestamp  数据类型的行为,使它与在标准中定义的行为一致。到那时,当前的  timestamp  数据类型将用 rowversion 数据类型替换。
 
Microsoft® SQL Server™ 2000 引入了  timestamp  数据类型的 rowversion 同义词。在 DDL 语句中尽可能使用 rowversion 而不使用  timestamp 。rowversion 受数据类型同义词行为的制约。有关更多信息,请参见数据类型同义词。
 
在  CREATE  TABLE  或  ALTER  TABLE  语句中,不必为  timestamp  数据类型提供列名:
 
CREATE  TABLE  ExampleTable (PriKey  int  PRIMARY  KEY timestamp )
 
如果没有提供列名,SQL Server 将生成  timestamp  的列名。rowversion 数据类型同义词不具有这样的行为。指定 rowversion 时必须提供列名。
 
一个表只能有一个  timestamp  列。每次插入或更新包含  timestamp  列的行时, timestamp  列中的值均会更新。这一属性使  timestamp  列不适合作为键使用,尤其是不能作为主键使用。对行的任何更新都会更改  timestamp  值,从而更改键值。如果该列属于主键,那么旧的键值将无效,进而引用该旧值的外键也将不再有效。如果该表在动态游标中引用,则所有更新均会更改游标中行的位置。如果该列属于索引键,则对数据行的所有更新还将导致索引更新。
 
不可为空的  timestamp  列在语义上等价于  binary (8) 列。可为空的  timestamp  列在语义上等价于 varbinary(8) 列。

IF OBJECT_ID('test_timestamp') IS NOT NULL
BEGIN
	DROP TABLE test_timestamp
END
GO
CREATE TABLE test_timestamp
(
	id INT PRIMARY KEY IDENTITY(1,1),
	tname NVARCHAR(20),
	[rowversion] TIMESTAMP	
)
GO
INSERT INTO test_timestamp (tname)
SELECT 't1' UNION
SELECT 't2' UNION
SELECT 't3' UNION
SELECT 't4'

SELECT * FROM test_timestamp tt

UPDATE test_timestamp
SET	tname = 't1_update'
WHERE id=1
--1. 仅仅获取已更新的行
--   但之前的最大的那个 rowversion 要另外记录
SELECT * FROM test_timestamp tt WHERE tt.rowversion>0x00000000000007DC

--2. 在两人同时修改同一条数据时,避免 先取出/后保存 覆盖前面的记录
DECLARE @rowversion TIMESTAMP
SELECT @rowversion = rowversion FROM test_timestamp tt WHERE tt.id=1;
--过了 5 秒后再修改, 在这 5 秒之内如果有其它update语句修改过此行则此修改无效了.
waitfor delay '00:00:05'
update test_timestamp set tname='t1_u01' where id=1 AND rowversion=@rowversion

SELECT * FROM test_timestamp tt WHERE tt.id=1
其实感觉还是不太好用, 不如直接用一个 ModifyDate 字段就好了
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值