timestamp介绍


  1. 公开数据库中自动生成的唯一二进制数字的数据类型。
  2. timestamp 通常用作给表行加版本戳的机制。
  3. 存储大小为 8 个字节。 不可为空的 timestamp 列在语义上等价于 binary(8) 列。可为空的 timestamp 列在语义上等价于 varbinary(8) 列。这将导致在C#程序中获取到的timestamp类型则变成了byte[]类型。所以如果我们需要从数据库中获取并使用这个时间戳的话就必需经过转换。
  4. timestamp 数据类型只是递增的数字,不保留日期或时间。 若要记录日期或时间,请使用 datetime 数据类型。
  5. 一个表只能有一个 timestamp 列。每次插入或更新包含 timestamp 列的行时,timestamp 列中的值均会更新。对行的任何更新都会更改 timestamp 值。
  6. 总结:SQL Server timestamp 数据类型与时间和日期无关。SQL Server timestamp 是二进制数字,它表明数据库中数据修改发生的相对顺序。实现 timestamp 数据类型最初是为了支持 SQL Server 恢复算法。每次修改页时,都会使用当前的 @@DBTS 值对其做一次标记,然后 @@DBTS 加1。这样做足以帮助恢复过程确定页修改的相对次序,但是 timestamp 值与时间没有任何关系。@@DBTS 返回当前数据库最后使用的时间戳值。插入或更新包含 timestamp 列的行时,将产生一个新的时间戳值。

如何使用SQL语句插入timestamp字段值?
我们从上面的timestamp定义中知道了timestamp这个值一般都是数据库自动添加和修改的,相当于自动增长标识一样(而且执行update修改语句这个字段也会自动更新),所以一般这个字段我们只做查询操作。如果要更新这个字段则会提示这个错误信息:不能更新时间戳列。但是这个字段是可以手动添加的,不过也只能使用DEFALUT字段(default字段为SQL Server数据库的一个默认值),如果传入其它值则会提示错误信息:不能将显式值插入时间戳列。请对列列表使用 INSERT 来排除时间戳列,或将 DEFAULT 插入时间戳列。

首先我们创建一个带TIMESTAMP类型的表[tb_Ts]:

CREATE TABLE [tb_Ts]([TS] TIMESTAMP)

下面是添加timestamp的SQL语句:

INSERT INTO [tb_Ts]([TS]) VALUES(DEFAULT)

我们可以将timestamp转换为十六进制或bigint,来方便进行比较和查看:

SELECT TS
,CAST(TS AS VARBINARY(8)) AS 'timestamp转十六进制'
,CONVERT(BIGINT,TS) AS 'timestamp转bigint类型'
FROM tb_Ts
WHERE
CONVERT(BIGINT,TS)>=18004

结果:

当然,我们也可以将bigint转换为timestamp类型,来进行比较:

DECLARE @TsValue BIGINT=82006

SELECT TS
,CAST(TS AS VARBINARY(8)) AS 'timestamp转十六进制'
,CONVERT(BIGINT,TS) AS 'timestamp转bigint类型'
FROM tb_Ts
WHERE
TS<=CONVERT(TIMESTAMP,@TsValue)

或者:

DECLARE @TsValue BIGINT=82006
DECLARE @Ts TIMESTAMP=CONVERT(TIMESTAMP,@TsValue) SELECT TS
,CAST(TS AS VARBINARY(8)) AS 'timestamp转十六进制'
,CONVERT(BIGINT,TS) AS 'timestamp转bigint类型'
FROM tb_Ts
WHERE
TS<=@Ts

结果:

时间戳字段在数据库中起什么作用:


1.给一个表加一个时间戳字段(timestamp),假设某条记录同时被两个人A和B读取并且正在修改。A先修改完成然后保存了,然后B再保存的时候,会由于时间戳不一致(因为A之前先保存修改了时间戳)导致B保存失败。timestamp是数据库记录版本控制的好东西,Linq to sql, entity framework都有很好的支持。

我们这里举一个EF Core的例子,假如我们在数据库中有一个表Book,它有一个timestamp类型的列TimeStampNumber,如下所示:

CREATE TABLE [dbo].[Book](
[ID] [int] IDENTITY(1,1) NOT NULL,
[BookCode] [nvarchar](20) NULL,
[PersonCode] [nvarchar](20) NULL,
[BookName] [nvarchar](50) NULL,
[ISBN] [nvarchar](20) NULL,
[TimeStampNumber] [timestamp] NULL,
CONSTRAINT [PK_Book] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

我们用EF Core的DB First模式,将表Book映射为实体后,其生成的实体类Book如下:

public partial class Book
{
public int Id { get; set; }
public string BookCode { get; set; }
public string PersonCode { get; set; }
public string BookName { get; set; }
public string Isbn { get; set; }
public byte[] TimeStampNumber { get; set; }
}

可以看到数据库中timestamp类型的列TimeStampNumber,在EF Core中的确被映射为了byte[]类型。

我们还可以看看实体类Book的Fluent API如下:

modelBuilder.Entity<Book>(entity =>
{
entity.Property(e => e.Id).HasColumnName("ID"); entity.Property(e => e.BookCode).HasMaxLength(); entity.Property(e => e.BookName).HasMaxLength(); entity.Property(e => e.Isbn)
.HasColumnName("ISBN")
.HasMaxLength(); entity.Property(e => e.PersonCode).HasMaxLength(); entity.Property(e => e.TimeStampNumber).IsRowVersion();
});

可以看到EF Core用IsRowVersion方法对属性TimeStampNumber作了标识。

如何在C#中将byte[]类型转换为long类型,请查看这里

2.数据库优化:当在处理几十万条并发数据时,我们就可以在使用最频繁的表中添加一列字段,类型为timestamp,添加完毕后系统会自动生成相应的唯一值,如果数据记录有任何改动,timestamp值也会做相应的调整。

最近被这个时间戳虐到了,,,这几篇博文解释的很好,感谢博主
1.http://www.cnblogs.com/iampkm/p/4082916.html
2.http://www.cnblogs.com/windows/articles/2149701.html

原文链接

SQL Server数据库(时间戳timestamp)类型 (转载)的更多相关文章

  1. SQL Server 数据库中的几个常见的临界值

    本文出处:http://www.cnblogs.com/wy123/p/6709520.html 1,SQL语句或者存储过程的最大长度(SQL字符串容量)是多少? 经常有人问,我的SQL语句是拼凑出来 ...

  2. 转载 50种方法优化SQL Server数据库查询

    原文地址 http://www.cnblogs.com/zhycyq/articles/2636748.html 50种方法优化SQL Server数据库查询 查询速度慢的原因很多,常见如下几种: 1 ...

  3. C#面试题(转载) SQL Server 数据库基础笔记分享(下) SQL Server 数据库基础笔记分享(上) Asp.Net MVC4中的全局过滤器 C#语法——泛型的多种应用

    C#面试题(转载) 原文地址:100道C#面试题(.net开发人员必备)  https://blog.csdn.net/u013519551/article/details/51220841 1. . ...

  4. SQL Server数据库字段类型说明

    SQL Server数据库字段类型说明 目前Sql Server 数据库一共有X个字段类型,大体分为9类,分别是字符串类型.二进制码字符串数据类型.Unincode字符串数据.整数类型.精确数据类型. ...

  5. SQL server数据库中的DateTime类型出现的问题

    我们知道这个SQL server数据库中的DateTime类型是数据库应用开发中经经常使用到的一种数据类型.而C#语言中也有DateTime类型,尽管二者都是用来描写叙述时间的,可是它们的默认值是不同 ...

  6. SQL SERVER数据库修改是否区分大小写(转载)

    昨天去客户,发现程序无法应用,跟踪错误提示,提示的大致意思是“数据库表名和数据库字段名不存在”.查询后发现是SQL Server数据库设置了区分大小写的缘故(一般安装时,Oracle的正确安装下是默认 ...

  7. SQL Server数据库的三种恢复模式:简单恢复模式、完整恢复模式和大容量日志恢复模式(转载)

    SQL Server数据库有三种恢复模式:简单恢复模式.完整恢复模式和大容量日志恢复模式: 1.Simple 简单恢复模式, Simple模式的旧称叫”Checkpoint with truncate ...

  8. SQL Server 数据库基于备份文件的【一键还原】

    1. 备份与还原的基础说明 我们知道在DBA的日常工作中,SQL Server 数据库的恢复请求偶有发生,可能是用作数据的追踪,可也可能能是数据库的灾难恢复. 数据库常用的备份命令如下: ----完整 ...

  9. SQL Server数据库 优化查询速度

    查询速度慢的原因很多,常见如下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优化. 4.内存不足 ...

随机推荐

  1. Java 开源博客 Solo 1.8.0 发布 - 改进文件上传

    本次发布主要是更新了编辑器,使其更好地支持文件上传.(1.8.0 版本变更记录请看这里) 我们的 Markdown 编辑器: 另外,我们对 HTTPS 的支持也更完善了,欢迎大家试用! 简介 Solo ...

  2. JSP内置对象——pageContext对象和config对象

    它对应的常用方法有: 现在,我新建一个“pageContext.jsp”页面,可以获得“session_page1.jsp”这个页面中保存的用户名: pageContext.jap: session_ ...

  3. 我的第一个个人博客网站 -> wizzie.top

    从去年下半年实习结束,到找到第一个属于自己的工作,我就开始着手搭建自己的网站. 使用阿里云学生服务器,域名,备案解析后,开始设计网站结构和页面布局. 因为临近毕业,网站真的是写的页面怎么多怎么写,所以 ...

  4. Android事件总线(二)EventBus3.0源码解析

    1.构造函数 当我们要调用EventBus的功能时,比如注册或者发送事件,总会调用EventBus.getDefault()来获取EventBus实例: public static EventBus ...

  5. puppeteer入门

    转自: https://www.jianshu.com/p/a89d8d6c007b 作者: ppCode puppeteer新手入门(chromium下载跳坑) ppCode 关注 2017.12. ...

  6. win7系统保护配置现错误“文件名、目录名或卷标语法不正确。(0x8007007B)

    windows7下系统保护功能很是鸡肋,有事会出现一下两个问题: 1.出现错误“文件名.目录名或卷标语法不正确.(0x8007007B) 2.保护设置列表中出现“Windows7_os(c:)(找不到 ...

  7. Python基础知识:函数

    1.定义函数和调用函数 #定义函数def def greet_user(username): '''简单的问候语''' print('Hello,%s!'%username) greet_user(' ...

  8. P进制转Q进制

    // 对一个P进制的数,如果要转换成Q进制的数 // 1)将P进制数x转换成十进制数y int y=0,product=1;//product在循环中会不断成P,得到1.P^2..... while( ...

  9. 在pycharm中每次运行代码不使用console而使用run

    问题:在pycharm中点击run运行程序,发现没有打开run窗口,而是打开的Python console窗口. 解决方法:打开菜单栏run->edit configurations,把下图中的 ...

  10. 环境变量(environment variable)

    环境变量是什么 环境变量指的就是操作系统当中的一些变量.可以通过修改环境变量,来对计算机进行配置(主要是来配置一些路径的) 查看环境变量右键 计算机(此电脑),选择属性——系统界面左侧选择 高级系统设 ...