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

作者:剑走江湖 时间:2024-01-14 13:32:46 

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;

执行后的结果如下:

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

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;


未修改前的数据表结果,如下图:


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


修改后的数据表结果,如下图:


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


注意:


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平台的博友针对其自增列的变更做个测试或给出个总结。

标签:sql,mysql,修改,自增列值
0
投稿

猜你喜欢

  • 一个css与js结合的下拉菜单支持主流浏览器

    2023-07-18 01:28:20
  • Python 给某个文件名添加时间戳的方法

    2023-02-10 21:12:56
  • Python机器学习之决策树

    2022-02-24 07:19:01
  • Python实现图片与视频互转代码实战(亲测有效)

    2021-05-30 17:21:03
  • 详解vue模拟加载更多功能(数据追加)

    2024-05-22 10:41:44
  • Python爬取网页信息的示例

    2021-02-09 10:43:21
  • vue日历/日程提醒/html5本地缓存功能

    2024-04-28 09:30:15
  • 使用python-opencv读取视频,计算视频总帧数及FPS的实现

    2022-02-03 06:55:34
  • javascript一些不错的函数脚本代码

    2023-07-02 05:25:52
  • python实现简单名片管理系统

    2023-06-13 08:03:12
  • python抓取最新博客内容并生成Rss

    2022-06-18 08:38:40
  • python正则表达式 匹配反斜杠的操作方法

    2023-09-04 22:18:52
  • Linux 发邮件磁盘空间监控(python)

    2022-03-15 09:17:24
  • 解决vue单页面多个组件嵌套监听浏览器窗口变化问题

    2024-04-27 15:48:29
  • MySql分组后随机获取每组一条数据的操作

    2024-01-26 21:12:11
  • SQL实现Excel的10个常用功能的示例详解

    2024-01-17 18:11:36
  • python socket 聊天室实例代码详解

    2023-06-03 16:37:57
  • Vuex的安装、搭建及案例详解

    2024-05-29 22:20:22
  • onmousewheel event 缩放图片效果

    2023-07-02 04:55:50
  • mysql数据库mysql: [ERROR] unknown option '--skip-grant-tables'

    2024-01-18 08:41:27
  • asp之家 网络编程 m.aspxhome.com