https://www.cnblogs.com/OpenCoder/p/10411186.html
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(20); entity.Property(e => e.BookName).HasMaxLength(50); entity.Property(e => e.Isbn) .HasColumnName("ISBN") .HasMaxLength(20); entity.Property(e => e.PersonCode).HasMaxLength(20); 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)类型 (转载)
原文:https://www.cnblogs.com/zhoading/p/12289271.html