SqlServer Mysql數(shù)據(jù)庫修改自增列的值及相應(yīng)問題的解決方案
SQL Server 平臺修改自增列值
由于之前處理過sql server數(shù)據(jù)庫的遷移工作,嘗試過其自增列值的變更,但是通過SQL 語句修改自增列值,是嚴(yán)格不允許的,直接報錯(無法更新標(biāo)識列 '自增列名稱‘)。sql server我測試是2008、2012和2014,都不允許變更自增列值,我相信SQL Server 2005+的環(huán)境均不允許變更字段列值。
如果非要在SQL Server 平臺修改自增列值的,那就手動需要自增列屬性,然后修改該列值,修改成功后再手動添加自增列屬性。如果在生成環(huán)境修改自增列的話,建議在空閑時間(零點以后,平臺或網(wǎng)站使用的用戶很少的時間段)來處理這類問題。數(shù)據(jù)量大且多表關(guān)聯(lián)的,那就通過T-SQL來變更。該方法最大的缺點就是要通過手工輔助取消和添加自增屬性的。
還有一個方法,先將要修改的數(shù)據(jù)整理為T-SQL的插入腳本,再刪除這批要修改的數(shù)據(jù),在通過顯示插入數(shù)據(jù)來實現(xiàn)。這種方式適用于要變更不較少的單表記錄,該方法到時比較靈活的。
更簡單的方法,那就是如果僅僅若干條,那就讓運營人員重新發(fā)布信息,刪除以前的數(shù)據(jù)。
還有網(wǎng)上通過修過T-SQL語句取消自增屬性,我在SQL Server 2005+環(huán)境測試均未通過,相應(yīng)的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;
執(zhí)行后的結(jié)果如下:
MySQL 平臺修改自增列值
mysql平臺修改自增列值,有些麻煩的。mysql中存在自增列,如果其引擎是myisam,則該列可以為獨立主鍵列,也可以為復(fù)合主鍵列,即該列必須為主鍵的關(guān)聯(lián)列;如果其引擎是innodb,則該列必須是獨立主鍵列。要直接修改兩個自增列值對調(diào)變更,肯定是不行的。
我采用的方法是將兩個自增列值(比如1、2)分為以下三個步驟來實現(xiàn):
1、先將自增列值為1的修改為0;
2、再將自增列值為2的修改為1;
3、再將自增列值為0的修改為2;
以下兩種數(shù)據(jù)引擎的測試環(huán)境均是mysql 5.6。
數(shù)據(jù)庫引擎為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;
未修改前的數(shù)據(jù)表結(jié)果,如下圖:
修改后的數(shù)據(jù)表結(jié)果,如下圖:
注意:
1、采用了兩個數(shù)字進(jìn)行交換的方法。
2、引入的中間值最好<=0的數(shù)字。
3、僅僅提供一種解決方法,也可采用sql server平臺的修改方法(1、先取消自增屬性后變更最后增加自增屬性,2、整理T-SQL腳本重新插入----小數(shù)據(jù)量時可以;3、運營人員手工重新添加,也是數(shù)據(jù)量小的情況下)。
數(shù)據(jù)庫引擎為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繼續(xù)執(zhí)行,均報錯卻又恢復(fù)了未修改之前的狀態(tài)“,這個還不清楚,需要繼續(xù)研究。
Oracle平臺的沒有接觸,不曉得,熟悉oracle平臺的博友針對其自增列的變更做個測試或給出個總結(jié)。
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。