如何修改自增列值以及相應的解決方法

来源:http://www.cnblogs.com/dzy863/archive/2016/01/23/5153276.html
-Advertisement-
Play Games

今天工作中遇到特殊的一個任務,就是將兩個自增列值的進行對調變更。SQL Server 平臺修改自增列值由於之前處理過sql server資料庫的遷移工作,嘗試過其自增列值的變更,但是通過SQL 語句修改自增列值,是嚴格不允許的,直接報錯(無法更新標識列 ’自增列名稱‘)。sql server我測試是...


今天工作中遇到特殊的一個任務,就是將兩個自增列值的進行對調變更。

  SQL Server 平臺修改自增列值   由於之前處理過sql server資料庫的遷移工作,嘗試過其自增列值的變更,但是通過SQL 語句修改自增列值,是嚴格不允許的,直接報錯(無法更新標識列 ’自增列名稱‘)。sql server我測試是2008、2012和2014,都不允許變更自增列值,我相信SQL Server 2005+的環境均不允許變更欄位列值。   如果非要在SQL Server 平臺修改自增列值的,那就手動需要自增列屬性,然後修改該列值,修改成功後再手動添加自增列屬性。如果在生成環境修改自增列的話,建議在空閑時間(零點以後,平臺或網站使用的用戶很少的時間段)來處理這類問題。數據量大且多表關聯的,那就通過T-SQL來變更。該方法最大的缺點就是要通過手工輔助取消和添加自增屬性的。   還有一個方法,先將要修改的數據整理為T-SQL的插入腳本,再刪除這批要修改的數據,在通過顯示插入數據來實現。這種方式適用於要變更不較少的單表記錄,該方法到時比較靈活的。   更簡單的方法,那就是如果僅僅若幹條,那就讓運營人員重新發佈信息,刪除以前的數據。   還有網上通過修過T-SQL語句取消自增屬性,我在SQL Server 2005+環境測試均未通過,相應的T-SQL代碼如下:
EXEC sys.sp_configure
    @configname = 'allow updates', -- varchar(35)
    @configvalue = 1-- int
 
EXEC sys.sp_configure
    @configname = 'show advanced options'  , -- varchar(35)
    @configvalue = 1-- int
 
RECONFIGURE WITH OVERRIDE;
GO
 
UPDATE sys.syscolumns
SET colstat = 1
WHERE id = OBJECT_ID(N'PrimaryKeyAndIdentityUpdateTestDataTable', 'U')
    AND name = N'ID'
    AND colstat = 1;
 
UPDATE sys.columns
SET is_identity = 0
WHERE object_id = OBJECT_ID(N'PrimaryKeyAndIdentityUpdateTestDataTable', 'U')
    AND name = N'ID'
    AND is_identity = 1;

 

 

執行後的結果如下:   MySQL 平臺修改自增列值   mysql平臺修改自增列值,有些麻煩的。mysql中存在自增列,如果其引擎是myisam,則該列可以為獨立主鍵列,也可以為複合主鍵列,即該列必須為主鍵的關聯列;如果其引擎是innodb,則該列必須是獨立主鍵列。要直接修改兩個自增列值對調變更,肯定是不行的。   我採用的方法是將兩個自增列值(比如1、2)分為以下三個步驟來實現: 1、先將自增列值為1的修改為0; 2、再將自增列值為2的修改為1; 3、再將自增列值為0的修改為2;   以下兩種數據引擎的測試環境均是mysql 5.6。   資料庫引擎為innodb的前提下,具體的mysql測試代碼如下:
drop table if exists identity_datatable;
create table identity_datatable (
  id int not null AUTO_INCREMENT, 
  name varchar(10) not null,
  primary key (id)  
) engine=innodb,default charset=utf8;
 
insert into identity_datatable (id, name)
values (1, '1'),(2,'2');
insert into identity_datatable (id, name)
values (3, '3'),(4,'4');
 
select *
from identity_datatable;
 
-- 直接修改不可行
-- update identity_datatable
-- set id = case when id = 1 then 2 when id = 2 then 1 end
-- where id in (1, 2);
 
update identity_datatable
set id = 0
where id = 1;
 
update identity_datatable
set id = 1
where id = 2;
 
update identity_datatable
set id = 2
where id = 0;
 
select *
from identity_datatable;

 

  未修改前的數據表結果,如下圖: 修改後的數據表結果,如下圖: 註意: 1、採用了兩個數字進行交換的方法。 2、引入的中間值最好<=0的數字。 3、僅僅提供一種解決方法,也可採用sql server平臺的修改方法(1、先取消自增屬性後變更最後增加自增屬性,2、整理T-SQL腳本重新插入----小數據量時可以;3、運營人員手工重新添加,也是數據量小的情況下)。   資料庫引擎為myisam的前提下,具體的mysql測試代碼如下:
drop table if exists autoincremenet_datatable_myisam;
create table autoincremenet_datatable_myisam (
  tid int not null,
  id int not null auto_increment,
  name varchar(20) not null,
  primary key(id)
) engine = myisam, default charset = utf8;
 
insert into autoincremenet_datatable_myisam (tid, id, name)
values(1,1,'a'),(2,2,'b'),(3,3,'c'),(4,4,'d');
 
select *
from autoincremenet_datatable_myisam;
 
update autoincremenet_datatable_myisam
set id = 0;
where id = 1;
 
select *
from autoincremenet_datatable_myisam;
 
update autoincremenet_datatable_myisam
set id = 1;
where id = 2;
 
select *
from autoincremenet_datatable_myisam;
 
update autoincremenet_datatable_myisam
set id = 2;
where id = 0;
 
select *
from autoincremenet_datatable_myisam;

 

註意: 1、以上測試中的變更不可行。 2、疑問“第一條update和其後面的select確實看到了修改後的值,但是隨後的sql繼續執行,均報錯卻又恢復了未修改之前的狀態“,這個還不清楚,需要繼續研究。   Oracle平臺的沒有接觸,不曉得,熟悉oracle平臺的博友針對其自增列的變更做個測試或給出個總結。   如果博友針對我提出的疑問有更好的解釋,也請指教,謝謝。  
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 問題描述:Gradle version 2.10 is required. Current version is 2.8.Gradle版本由2.8升為2.10後,發現所有依賴play-services的module都無法構建了,提示如下錯誤:java.io.FileNotFoundException...
  • 前言 市面上絕大部分的APP被打開之後映入眼帘的都是一個美輪美奐的輪播器,所以能做出一個符合需求、高效的輪播器成為了一個程式員的必備技能。所以今天的這篇博客就來談談輪播器這個看似簡單的控制項其中蘊含的道理。正文 首先我們來分析一下該如何去實現一個類似下圖的輪播器(圖片數量、URL由伺服器返...
  • jsonkit通過Dictionary轉換成JSON字元串時總是崩潰。解析代碼:崩潰地點分析是因為我的參數中全是數字找了一下原因,不知道知道怎麼設置,(求大神指點)這裡有一個折中辦法使用 NSJSONSerialization 進行序列化
  • Android實現自定義對話框效果:核心代碼:package com.example.diydialog;import android.os.Bundle;import android.app.Activity;import android.app.AlertDialog;import androi...
  • 通常代理的使用需要以下幾個步驟: 1、制定協議。協議可以在委托對象的.h中聲明,也可以在單獨的.h中聲明。制定協議後,在協議中聲明需要代理對象來實現的方法。 2、設置代理屬性。制定協議後需要為委托對象設置一個代理屬性,代理屬性的作用是存儲委托對象的代理對象。具體格式如下:@property (no....
  • 菜單滾動視圖也是在項目開發過程中比較常用到的功能,先直接看效果圖實現的效果如下:當菜單個數的總長度超過一個屏寬度就計算每一個的文字寬度,若沒有則只進行一個屏平分,點擊菜單項時,滾動的視圖位置會隨著調整;下麵將會把代碼貼出來;1:控制器.h文件的內容//// myScrollerViewContro....
  • 一,效果圖。二,工程圖。三,代碼。RootViewController.h#import @interface RootViewController : UIViewController{ UIScrollView *scoreView;}@endRootViewController.m#im...
  • 參考:http://blog.csdn.net/qq418716640/article/details/8508973http://www.cnblogs.com/mengdd/p/3335508.html效果:一個手指實現(所有手勢事件)和(部分事件的);A. 所有手勢activity_main....
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...