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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...