sqlserver:关于timestamp时间戳 rowversion

79 篇文章 10 订阅

环境:

  • window10
  • sqlserver2014
  • vs2022
  • .net core 3.1

参考:

微软官方文档:rowversion (Transact-SQL)

在sqlsever中 timestamprowversion是同义词,它和 ISO 标准中定义的 timestamp 数据类型表现不同。

在sqlserver中,timestamp的作用是给每行的数据加上版本标志,但这个标志和时间没有任何关系,可以将它看成是byte[8]数组并且是数据库全局自增的。

因为timestamp的取值是数据库全局自增的,所以它是多表共享的。可以通过 @@DBTS查看当前的版本号。

1. 实验timestamp:

准备表:

create table test2(
   id int identity(1,1) primary key,
   name varchar(50),
   flag timestamp
)

查看当前数据库的版本:
在这里插入图片描述
向这个表插入三行数据:

insert into test2(name) values('小名'),('小红'),('小刚')

查看表数据及DBTS:
在这里插入图片描述

在这里插入图片描述

可以看到,timestamp列的值是自增的,并且和全局的DBTS保持一致。
再修改表两条数据:

update test2 set name=name+'2' where id=1
update test2 set name=name+'2' where id=2

再查看表数据及全局DBTS:
在这里插入图片描述
在这里插入图片描述
和预料的一样,版本号增加到了2097,再进行删除操作(删除操作不会导致DBTS自增):

delete from test2 where id=1

然后,再观察表数据和全局DBTS:
在这里插入图片描述
在这里插入图片描述

可以看到,删除数据并不会导致DBTS自增,为了进一步验证,再插入一条数据:

insert into test2(name) values('小兰')

再观察表数据和全局DBTS:
在这里插入图片描述
在这里插入图片描述
可以看到,新插入数据又导致全局DBTS自增了。

2. timestamp和rowversion是同义词

虽然它们两个是同义词,但行为上并不完全相同。
当ddl创建表时,可以声明timestamp列类型而不指定表名,此时数据库自动生成列名timestamp,而rowversion则必须指定表名。

3. timestamp不对外开放写入

数据库控制timestamp列值的生成和更新,我们无法手动插入和更新,如下:
在这里插入图片描述
在这里插入图片描述

4. 在映射到c#数据类型

由于从ado.net 中读取后为一个8字节的数组,所以我们需要使用byte[]来接受,如果我们准备使用long的话就需要自行转换,或者读取时使用sql:select flag,cast(flag as bigint) from test2

5. timestamp或被弃用

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jackletter

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值