RowVersion字段从SqlServer到PostgreSQL的迁移

SQL Server 有个列是rowversion,之前是timestamp,因此这两个关键字在SQL server中是同义词,不过目前timestamp处在废弃阶段,因此我们最好使用rowversion来代替它。而在数据库迁移时,因为使用到该类型,因此要考虑怎么迁移它。

  • 📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!

  • 📢本文作者:由webmote 原创,首发于 【CSDN】

  • 📢作者格言:生活在于折腾,当你不折腾生活时,生活就开始折腾你,让我们一起加油!💪💪💪

1. SQL Server中 RowVersion的含义

Timestamp/rowversion 是一个EF Core属性,在每次插入或更新数据行时,数据库会自动为其生成新值。

因此此属性也被视为并发标记,这确保了在你查询行后,如果正在更新的行发生了更改,则会出现异常。可以参考之前的数据库乐观锁介绍。

对于 SQL Server,通常使用 byte [] 属性,该属性将设置为数据库中的 ROWVERSION 列。

代码如下:

public class Blog {public int BlogId {get; set; } public string Url { get; set; }[Timestamp]public byte[] Timestamp { get; set; }
}

当然也可以是在 OnModelCreating 内设置

internal class MyContext : DbContext
{public DbSet<Blog> Blogs { get; set; }protected override void OnModelCreating(ModelBuilder modelBuilder){modelBuilder.Entity<Blog>().Property(p => p.Timestamp).IsRowVersion();}
}public class Blog
{public int BlogId { get; set; }public string Url { get; set; }public byte[] Timestamp { get; set; }
}

注意: 如果需要映射到ulong,需要使用转换函数HasConversion

modelBuilder.Entity<Blog>().Property(p => p.Timestamp).IsRowVersion().HasConversion<int>();

在SQL Server里,RowVersion是一种自增的只用于定义数据表的列类型,其值占用的大小是固定的8个字节,是SQL Server数据库自动生成的、数据库级别唯一的、二进制数字,使用binary(8)存储。

1.1 递增原理介绍

每个数据库都有一个自增的计数器,该计数器是Database RowVersion,在用户对有RowVersion 字段的数据表执行插入或修改命令时,该计数器就会增加。

可以使用全局变量 @@DBTS 进行查询其值, 该值在整个数据库中是唯一的、递增的,不可回滚的。

select @@DBTS;

当然对于一个数据表,最多有一个RowVersion 字段。

1.2 RowVersion字段的特性

  1. 每个数据库只有一个计数器,因此所有拥有RowVersion字段的数据表,其值都是不同的;

  2. 数据库的RowVersion 只会递增,不会回滚;

  3. 由数据库自动赋值(插入,修改),不能显式赋值;

2. PostgreSQL 有无Timestamp/RowVersion

PostgreSQL中具有Timestamp类型,其是日期时间字段,并不能直接转为SQL Server的RowVersion/Timestamp类型。

与RowVersion行为最为接近的列类型,是PostgreSQL中用于MVCC管理的 xmin隐藏列,这个列每个表系统都会自动建立,因此无需增加。当然还有其他隐藏列,比如xmax,xmin表示插入该表的事务号,xmax表示删除该表的事务号。

唯一的瑕疵是使用xmin作为行版本标识不能区别同一个事务内的两次、多次修改。当然事务内的第一次修改对其他事务不可见,唯一能看见它的只有修改这一行的事务自己。

在EF中我们可以采用下列实体定义,以便支持xmin列。

[Timestamp]
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
[Column("xmin", TypeName = "xid")]
public uint Rowversion { get; set; }

当然,也可以在OnConfiguring里写语句。

builder.Entity<EmailAddressValidation>()
.Property(e => e.RowVersion).IsRowVersion().HasColumnName("xmin").HasConversion<int>();

检查数据库数据,OK,是那么的回事了。

c51a057fdec2fa8104a96bcde9a3e8ed.png

3. 小结

rowversion字段还是挺有意思的,你学废了吗?

👓都看到这了,还在乎点个赞吗?

👓都点赞了,还在乎一个收藏吗?

👓都收藏了,还在乎一个评论吗?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/295429.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

支付宝手机支付

1 在 "商家服务"开通"移动支付" 2 创建应用

java序列化有什么用_java中序列化的作用

一 什么叫序列化通俗点讲&#xff1a;它是处理对象流的一种机制&#xff0c;即可以很方便的保存内存中java对象的状态&#xff0c;同时也为了方便传输。二 序列化有什么作用1.方便传输&#xff0c;速度快&#xff0c;还很安全&#xff0c;被调用方序列化&#xff0c;调用方反序…

zk 08之:Curator之一:zk客户端Curator

Curator是Netflix公司开源的一个Zookeeper客户端&#xff0c;与Zookeeper提供的原生客户端相比&#xff0c;Curator的抽象层次更高&#xff0c;简化了Zookeeper客户端编程。 它包含以下几个组件&#xff1a; ComponentdescriptionRecipesImplementations of some of the common…

decimal,float和double的区别

一直很奇怪C#的预定义数据类型中为什么加了一个decimal&#xff0c;有float和double不就够了吗&#xff1f;今天来挖一挖。 浮点型 Name CTS Type De script ion Significant Figures Range (approximate) float System.Single 32-bit single-precision f…

Android之调用微信登陆、分享、支付

转载&#xff1a;http://blog.csdn.net/lowprofile_coding/article/details/48086381 前言:用了微信sdk各种痛苦,感觉比qq sdk调用麻烦多了,回调过于麻烦,还必须要在指定包名下的actvity进行回调,所以我在这里写一篇博客,有这个需求的朋友可以借鉴一下,以后自己别的项目有用到…

两年发表14篇论文,其中10篇一作,这是她的科研进阶攻略

全世界只有3.14 % 的人关注了爆炸吧知识本文来源&#xff1a;浙江大学两年发表14篇论文&#xff0c;其中一作10篇&#xff0c;包括4篇Top SCI&#xff0c;2篇SCI和4篇EI&#xff1b;持有2项发明专利&#xff0c;出版1部英文专著&#xff0c;斩获2020年度学生学术十大新成果奖第…

生活在任务栏的猫, CPU使用率越高它就跑的越快

生活在任务栏的猫, CPU使用率越高它就跑的越快Runcat 是一个桌面软件, 这只猫会显示在您的任务栏上面, 它会一直奔跑, 它的运行速度取决于CPU的使用率, 支持 Windows 和 Mac 平台。您还可以用它查看系统资源使用率, 包括CPU使用率,内存,电池状态,网络传输速度等。如果这只猫一直…

在Ant的javac中指定源文件编码方式,以避免警告: 编码 GBK 的不可映射字符的错误...

为什么80%的码农都做不了架构师&#xff1f;>>> * 该错误会造成源文件中的字符串出现混乱&#xff0c;从而影响indexOf()之类函数的正常功能&#xff0e; <javac srcdir"${common.src.dir}" destdir"${build.temp.common.classes.dir}" de…

Oracle命令--alter 操作

1 alter database&#xff1a;修改数据文件 alter database datafile 4 offline; alter database datafile /opt/oracle/datafile/users01.dbf offline; alter database datafile /opt/oracle/datafile/users01.dbf resize 100M; alter database datafile /opt/oracle/datafile…

java 正则匹配引号_java 正则 贪婪匹配 匹配sql语句中的引号内容

public class Demo {public static void main(String[] args) {String sql1 "use test;select * from default.abc where dtabc;faf;fff and ct\"2012;43\" ; ";sql1 "select * from aaa where dt 20 ;12; 34;3 AND namefafae; fa ; a";//配置…

现在要吃软饭的,都这么明目张胆了吗?

1 加我一个&#xff1f;▼2 为什么电梯里会有两只光着的右脚&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼这样&#xff1f;3 老爹的脸更黑了▼4 但也不影响吧&#xff1f;都不及格▼5 妈&#xff0c;你说的一点都没错&#xff01;&#xff08;素材来源网络&…

Android之app引导页(背景图片切换加各个页面动画效果)

转载&#xff1a;http://blog.csdn.net/lowprofile_coding/article/details/48037095 先看效果图: 1.显示三个页面的Activity 用view pager去加载三个fragment实现,控制点点点的切换,监听view pager的切换,控制fragment动画的开始跟结束,重写了view pager,实现了背景图片的移…

VSCode SSH 连接提示: spawn UNKNOWN

随笔记录 目录 1. 背景介绍 2. 确认问题 : ssh -V 3. 解决问题 3.1 确认本地 ssh.exe 路径 3.2 修改vscode Remote.ssh:Path 3.2.1 设置 Reomte.ssh:Path - 方法一 3.2.2 设置 Reomte.ssh:Path - 方法二 1. 背景介绍 windows 系统vscode ssh remote CentOS7&#xff…

手把手教你学Dapr - 9. 可观测性

介绍通过Tracing(跟踪)、Metrics(指标)、Logs(日志)和Health(运行状况)监控应用程序。分布式跟踪Dapr 使用 Zipkin 协议进行分布式跟踪 和 Metrics 收集。由于 Zipkin 协议的普遍性&#xff0c;许多后端都是开箱即用的&#xff0c;例如 Stackdriver、Zipkin、New Relic 等。结合…

Tumblr技术架构

近日&#xff0c;著名博客社区Tumblr被Yahoo用11亿美金收购。为什么Yahoo对Tumblr如此看重&#xff0c;下面是Tumblr的技术架构介绍。 本打算自己翻译一下&#xff0c;但发现已经有人这么做了&#xff0c;就直接转载好了 最近的新闻中我们得知雅虎11亿美元收购了Tumblr: Yaho…

ip_vs实现分析(2)

本文档的Copyleft归yfydz所有&#xff0c;使用GPL发布&#xff0c;可以自由拷贝&#xff0c;转载&#xff0c;转载时请保持文档的完整性&#xff0c;严禁用于任何商业用途。msn: yfydz_no1hotmail.com来源&#xff1a;http://yfydz.cublog.cn 4. 模块初始化初始化函数先初始化i…

这些魔术用的是物理原理?有啥诀窍?

全世界只有3.14 % 的人关注了爆炸吧知识许多成功的魔术&#xff0c;都运用了物理知识。我们在观看魔术表演时&#xff0c;也可以学到相当多的知识&#xff0c;有时用一般的原理就可以表演一个十分精彩的魔术。所以我们希望揭开魔术的神秘面纱&#xff0c;探究其中的物理知识。一…

二分查找找下标或者值

public class Util { //求最大值public static int maxValue(int a,int b){int max=0;if(a>b){max=a;}else{max=b;}return max;}//求最小值public static int minValue(int a,int b){int min=0;if(a>b){min=b;}else{min=a;}return min;}//选择排序public static int[] se…

安装Wamp时出现无法启动此程序,因为计算机中丢失MSVCR110.dll的解决方法

可能有的朋友在运行某软件时&#xff0c;会出现了“无法启动此程序,因为计算机中丢失 MSVCR110.dll。尝试重新安装该程序以解决此问题。”的提示,遇到这样的情况该怎么办呢&#xff1f;不用着急&#xff0c;下面小编就为大家带来解决方法&#xff0c;遇到同样问题却不知道如何解…

java 线程 获取消息_获取java线程中信息

怎样获取java线程中信息&#xff1f;在进行多线程编程中&#xff0c;比较重要也是比较困难的一个操作就是如何获取线程中的信息。大多数人会采取比较常见的一种方法就是将线程中要返回的结果存储在一个字段中&#xff0c;然后再提供一个获取方法将这个字段的内容返回给该方法的…