前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何修改自增列值以及相应的解决方法

如何修改自增列值以及相应的解决方法

作者头像
逸鹏
发布2018-04-11 11:11:26
3.4K0
发布2018-04-11 11:11:26
举报
文章被收录于专栏:逸鹏说道逸鹏说道

今天工作中遇到特殊的一个任务,就是将两个自增列值的进行对调变更。

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代码如下:

代码语言:javascript
复制
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.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测试代码如下:

代码语言:javascript
复制
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测试代码如下:

代码语言:javascript
复制
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;
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-10-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 我为Net狂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档