程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> MSSQL >> SqlServer Mysql數據庫修正自增列的值及響應成績的處理計劃

SqlServer Mysql數據庫修正自增列的值及響應成績的處理計劃

編輯:MSSQL

SqlServer Mysql數據庫修正自增列的值及響應成績的處理計劃。本站提示廣大學習愛好者:(SqlServer Mysql數據庫修正自增列的值及響應成績的處理計劃)文章只能為提供參考,不一定能成為您想要的結果。以下是SqlServer Mysql數據庫修正自增列的值及響應成績的處理計劃正文


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平台的博友針對其自增列的變革做個測試或給出個總結。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved