SqlServer Mysql数据库修改自增列的值及相应问题的解决方案是怎样的

65次阅读
没有评论

共计 3164 个字符,预计需要花费 8 分钟才能阅读完成。

行业资讯    
数据库    
SqlServer Mysql 数据库修改自增列的值及相应问题的解决方案是怎样的

今天就跟大家聊聊有关 SqlServer Mysql 数据库修改自增列的值及相应问题的解决方案是怎样的,可能很多人都不太了解,为了让大家更加了解,丸趣 TV 小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

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; -- intEXEC sys.sp_configure@configname =  show advanced options  , -- varchar(35)@configvalue = 1; -- intRECONFIGURE WITH OVERRIDE;GOUPDATE sys.syscolumnsSET colstat = 1WHERE id = OBJECT_ID(N PrimaryKeyAndIdentityUpdateTestDataTable ,  U)AND name = N ID AND colstat = 1;UPDATE sys.columnsSET is_identity = 0WHERE 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_datatableset id = 0where id = 1;update identity_datatableset id = 1where id = 2;update identity_datatableset id = 2where 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_myisamset id = 0;where id = 1;select *from autoincremenet_datatable_myisam;update autoincremenet_datatable_myisamset id = 1;where id = 2;select *from autoincremenet_datatable_myisam;update autoincremenet_datatable_myisamset id = 2;where id = 0;select *from autoincremenet_datatable_myisam;

注意:

1、以上测试中的变更不可行。

2、疑问“第一条 update 和其后面的 select 确实看到了修改后的值,但是随后的 sql 继续执行,均报错却又恢复了未修改之前的状态“,这个还不清楚,需要继续研究。

看完上述内容,你们对 SqlServer Mysql 数据库修改自增列的值及相应问题的解决方案是怎样的有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注丸趣 TV 行业资讯频道,感谢大家的支持。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-17发表,共计3164字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)