• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    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平台的博友针对其自增列的变更做个测试或给出个总结。

    您可能感兴趣的文章:
    • sqlserver2005自动创建数据表和自动添加某个字段索引
    • SQL Server 打开或关闭自增长
    • SQL Server 2008怎样添加自增列实现自增序号
    • SQL Server设置主键自增长列(使用sql语句实现)
    • SQL Server修改标识列方法 如自增列的批量化修改
    • Oracle 实现类似SQL Server中自增字段的一个办法
    • SQL SERVER 自增列
    • SQL Server 中调整自增字段的当前初始值
    • SQL Server数据表字段自定义自增数据格式的方法
    上一篇:SQL Server中避免触发镜像SUSPEND的N种方法
    下一篇:SQL SERVER修改函数名容易引发的问题分析
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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