SQL Server 2012自動標識列值跳轉問題

来源:https://www.cnblogs.com/88223100/archive/2020/04/05/SQL-Server-2012-Auto-Identity-column-Value-Jump-Issue.html
-Advertisement-
Play Games

在SQL Server 2012版本中,當重新啟動SQL Server實例時,表的身份值將被跳轉,而實際跳轉的值取決於身份列數據類型。 如果是整數(int)數據類型,則跳轉值為1000;如果為大整數(bigint),則跳轉值為10000。從我們的應用程式角度來看,此增量不適用於所有業務案例,尤其是當... ...


簡介

  在SQL Server 2012版本中,當重新啟動SQL Server實例時,表的身份值將被跳轉,而實際跳轉的值取決於身份列數據類型。 如果是整數(int)數據類型,則跳轉值為1000;如果為大整數(bigint),則跳轉值為10000。從我們的應用程式角度來看,此增量不適用於所有業務案例,尤其是當該值 向客戶展示。 這是僅SQL Server 2012附帶的特殊情況/問題,較早的版本沒有此問題。

背景

  幾天前,我們的質量檢查工程師聲稱,表的標識列之一跳了10000。這意味著該表的最後一個標識值是2200,現在是12001。在我們的業務邏輯中,該值向客戶顯示了 不會被客戶接受。 因此,我們必須解決這個問題。

代碼如下

  第一次,我們都對這種可能性感到驚訝和困惑。 我們通常不會在標識列中插入任何值(可以將值插入標識列)。 標識值由SQL Server本身維護。 我們的核心團隊成員之一開始調查此問題並找到瞭解決方案。 現在,我想詳細介紹一下我的同事發現的問題和解決方案。

如何重現?

  您需要設置SQL Server 2012並創建測試資料庫。 然後創建一個帶有自動標識列的表:

  

create table MyTestTable(Id int Identity(1,1), Name varchar(255));

  然後插入2行數據

insert into MyTestTable(Name) values ('Mr.Tom');
insert into MyTestTable(Name) values ('Mr.Jackson'); 

  然後查看結果

SELECT Id, Name FROM MyTestTable; 

  結果是預期的。 現在,只需重新啟動SQL Server服務即可。 您可以通過多種方式進行操作。 我們是從SQL Server Management Studio完成的。

重啟之後,我們向剛纔的表格再插入2條數據

insert into MyTestTable(Name) values ('Mr.Tom2');
insert into MyTestTable(Name) values ('Mr.Jackson2');

查看結果

SELECT Id, Name FROM MyTestTable;

  現在你看到重啟SQL Server 2012 之後的結果,它的自增列的值從1002開始了。 也就是跳躍了 1000。之前說過,如果我們自增列的數據類型是 長整型(bigint)的話,它的跳躍值就將會是 10000。

真的是個Bug嗎?

  Microsoft宣稱它是功能而不是錯誤,並且在許多情況下會有所幫助。 但是在我們的情況下,這是不可接受的,因為該數字會顯示給客戶端,並且客戶端會驚訝地看到跳轉後的新數字,而新數字取決於重新啟動SQL Server的次數。 如果客戶端看不到它,則可以接受,以便在內部使用該號碼。

解決方案

如果我們對微軟提供的這個 “功能” 不感興趣,我們可以通過兩種途徑來關閉它。

1. 使用序列 (Sequence)

2. 為SQL Server 註冊啟動參數 -t272

 

使用序列

首先,我們需要移除表格的自增列。然後創建一個不帶緩存功能的序列,根據此序列插入數值。 下麵是示例代碼

CREATE SEQUENCE Id_Sequence
    AS INT
    START WITH 1
    INCREMENT BY 1
    MINVALUE 0
    NO MAXVALUE
   NO CACHE
insert into MyTestTable values(NEXT VALUE FOR Id_Sequence, 'Mr.Tom'); 
insert into MyTestTable values(NEXT VALUE FOR Id_Sequence, 'Mr.Jackson'); 

註冊啟動參數 -t272

打開SQL Server配置管理器。 選擇 SQL Server 2012 實例,右鍵, 選擇屬性菜單。在彈出的視窗中找到啟動參數,然後註冊 -t272。 完成之後重啟下圖中的SQL Server(SQLSERVER2012), 之後進行bug重現的操作,驗證問題是否已解決。

 

如果太多的表包含資料庫的標識列,並且所有表都包含現有值,則最好使用解決方案2。因為這是一個非常簡單的解決方案,並且其範圍是伺服器明智的。 這意味著,如果在此處添加SQL Server 2012參數-t272,則會影響在那裡的所有資料庫。 如果要創建新資料庫,並且需要自動生成的數字欄位,則可以使用解決方案1,這意味著對列使用序列值而不是自動標識值。 您可以在網上找到很多文章,有關何時使用序列和彼此的優缺點時將使用自動標識列。 希望您閱讀所有這些內容並做出適當的決定。

 

相關鏈接:https://www.codeproject.com/Tips/668042/SQL-Server-2012-Auto-Identity-column-Value-Jump-Is


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • SpringBoot系列(二)入門知識 往期推薦 "SpringBoot系列(一)idea新建springboot項目" 引言 本來新建springboot項目應該放在入門知識這一章的,但是由於新建springboot的第一篇文章只介紹了一種新建項目的方法,所以在這一章講解一下springboot的 ...
  • 因項目需要申請了新伺服器,故要重新配置環境。 nginx安裝: 一鍵安裝四個依賴: yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel 進入/usr/local/src目錄,創建nginx文件夾 cd /usr/lo ...
  • 良許在工作中,寫過一個 Shell 腳本,這個腳本可以從 4 個 NTP 伺服器輪流獲取時間,然後將最可靠的時間設置為系統時間。 因為我們對於時間的要求比較高,需要在短時間內就獲取到正確的時間。所以我們就需要對這個腳本運行時間進行測試,看看從開始運行到正確設置時間需要花費多少時間。 其實在工作中,還 ...
  • 1、命令基礎 1.1、命令操作語法 命令 [參數] [文件] 參數,可有可無 文件,可有可無 2、基礎命令 2.1、查看當前工作目錄 pwd print name of current/workin directory 列印 名字 或 工作 目錄 2.2、切換目錄 cd cd 目錄 相對路徑與絕對路 ...
  • [TOC] 1.集群架構 | 主機名 | 角色 | IP地址 | | : : | : : | : : | | hdss7 21.host.com | flannel | 10.4.7.21 | | hdss7 22.host.com | flannel | 10.4.7.22 | 部署方法以hdss ...
  • redis 實戰-redis 事務 1.描述 redis 事務單獨的隔離操作:事務中的所有命令都會序列化、按順序執行。事務在執行過程中,不會被其他客戶端發送過來的命令請求所打斷。 redis 事務沒有隔離級別的概念:隊列中的命令沒有提交之前都不會實際的被執行,因為事務提交前任何指令都不會被實際執行, ...
  • 資料庫隔離級別 如果沒有隔離級別會出現的問題 臟讀 意思是讀取到了事務正在修改的數據,如果事務回滾,那麼拿到的數據就是錯誤的 | 時間 | 事務A | 事務B | | | | | | 1 | 開始事務 | | | 2 | 讀取quantity為5 | | | 3 | 修改quantity為4 | | ...
  • 操作系統配優化 執行計劃與鎖表查看 --查看連接信息以及連接執行的命令 SHOW PROCESSLIST --查看當前被鎖住的表 show OPEN TABLES where In_use > 0; --開啟會話級別的profile SET profiling=1 --查看所有的資料庫操作執行過程 ...
一周排行
    -Advertisement-
    Play Games
  • 1. 說明 /* Performs operations on System.String instances that contain file or directory path information. These operations are performed in a cross-pla ...
  • 視頻地址:【WebApi+Vue3從0到1搭建《許可權管理系統》系列視頻:搭建JWT系統鑒權-嗶哩嗶哩】 https://b23.tv/R6cOcDO qq群:801913255 一、在appsettings.json中設置鑒權屬性 /*jwt鑒權*/ "JwtSetting": { "Issuer" ...
  • 引言 集成測試可在包含應用支持基礎結構(如資料庫、文件系統和網路)的級別上確保應用組件功能正常。 ASP.NET Core 通過將單元測試框架與測試 Web 主機和記憶體中測試伺服器結合使用來支持集成測試。 簡介 集成測試與單元測試相比,能夠在更廣泛的級別上評估應用的組件,確認多個組件一起工作以生成預 ...
  • 在.NET Emit編程中,我們探討了運算操作指令的重要性和應用。這些指令包括各種數學運算、位操作和比較操作,能夠在動態生成的代碼中實現對數據的處理和操作。通過這些指令,開發人員可以靈活地進行算術運算、邏輯運算和比較操作,從而實現各種複雜的演算法和邏輯......本篇之後,將進入第七部分:實戰項目 ...
  • 前言 多表頭表格是一個常見的業務需求,然而WPF中卻沒有預設實現這個功能,得益於WPF強大的控制項模板設計,我們可以通過修改控制項模板的方式自己實現它。 一、需求分析 下圖為一個典型的統計表格,統計1-12月的數據。 此時我們有一個需求,需要將月份按季度劃分,以便能夠直觀地看到季度統計數據,以下為該需求 ...
  • 如何將 ASP.NET Core MVC 項目的視圖分離到另一個項目 在當下這個年代 SPA 已是主流,人們早已忘記了 MVC 以及 Razor 的故事。但是在某些場景下 SSR 還是有意想不到效果。比如某些靜態頁面,比如追求首屏載入速度的時候。最近在項目中回歸傳統效果還是不錯。 有的時候我們希望將 ...
  • System.AggregateException: 發生一個或多個錯誤。 > Microsoft.WebTools.Shared.Exceptions.WebToolsException: 生成失敗。檢查輸出視窗瞭解更多詳細信息。 內部異常堆棧跟蹤的結尾 > (內部異常 #0) Microsoft ...
  • 引言 在上一章節我們實戰了在Asp.Net Core中的項目實戰,這一章節講解一下如何測試Asp.Net Core的中間件。 TestServer 還記得我們在集成測試中提供的TestServer嗎? TestServer 是由 Microsoft.AspNetCore.TestHost 包提供的。 ...
  • 在發現結果為真的WHEN子句時,CASE表達式的真假值判斷會終止,剩餘的WHEN子句會被忽略: CASE WHEN col_1 IN ('a', 'b') THEN '第一' WHEN col_1 IN ('a') THEN '第二' ELSE '其他' END 註意: 統一各分支返回的數據類型. ...
  • 在C#編程世界中,語法的精妙之處往往體現在那些看似微小卻極具影響力的符號與結構之中。其中,“_ =” 這一組合突然出現還真不知道什麼意思。本文將深入剖析“_ =” 的含義、工作原理及其在實際編程中的廣泛應用,揭示其作為C#語法奇兵的重要角色。 一、下劃線 _:神秘的棄元符號 下劃線 _ 在C#中並非 ...