日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

RowVersion字段从SqlServer到PostgreSQL的迁移

發布時間:2023/12/4 数据库 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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; }1701698640public 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字段的特性

  • 每個數據庫只有一個計數器,因此所有擁有RowVersion字段的數據表,其值都是不同的;

  • 數據庫的RowVersion 只會遞增,不會回滾;

  • 由數據庫自動賦值(插入,修改),不能顯式賦值;

  • 2. PostgreSQL 有無Timestamp/RowVersion

    PostgreSQL中具有Timestamp類型,其是日期時間字段,并不能直接轉為SQL Server的RowVersion/Timestamp類型。

    與RowVersion行為最為接近的列類型,是PostgreSQL中用于MVCC管理的 xmin隱藏列,這個列每個表系統都會自動建立,因此無需增加。當然還有其他隱藏列,比如xmax,xmin表示插入該表的事務號,xmax表示刪除該表的事務號。

    唯一的瑕疵是使用xmin作為行版本標識不能區別同一個事務內的兩次、多次修改。當然事務內的第一次修改對其他事務不可見,唯一能看見它的只有修改這一行的事務自己。

    在EF中我們可以采用下列實體定義,以便支持xmin列。

    1701698640 [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,是那么的回事了。

    3. 小結

    rowversion字段還是挺有意思的,你學廢了嗎?

    👓都看到這了,還在乎點個贊嗎?

    👓都點贊了,還在乎一個收藏嗎?

    👓都收藏了,還在乎一個評論嗎?

    總結

    以上是生活随笔為你收集整理的RowVersion字段从SqlServer到PostgreSQL的迁移的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。