• MSSQL标识ID的修改


           今天机缘巧合,无意听到别人闲聊,突发奇想设计一套系统来解决他们的痛点,待我进一步分析下如何执行。回到主题,最近修改ID的工作做了不少。企业补充历史数据用。现总结如下:

     1.想把递增ID某一段的ID都加上10,本以为写一条UPDATE 语句 如下

                 SET IDENTITY_INSERT c1 ON 

                       UPDATE c1 SET ID=ID+10 WHERE ID<15 AND ID>10
                 SET IDENTITY_INSERT c1 OFF

                 结果执行错误:原因如下

                 标识符号没法直接更新,只能改为非标识符号才能更新,修改成非标识符号会修改表的创建时间。

     2.不能主表跟子表同时设置为ID递增无效    

    SET IDENTITY_INSERT c1 ON -- 设置标识符 可以添加 只能设置一个
    SET IDENTITY_INSERT g1 ON -- 同时允许无效
    SET IDENTITY_INSERT c1 OFF -- 当插入的标识ID大于现有ID 则系统按最大的进行递增
    3.插入标识ID的方法
    --将ID=3的记录的ID值改为2
    SET IDENTITY_INSERT t1 ON
    INSERT t1(ID,A) SELECT 2,A FROM t1 WHERE ID=3
    DELETE FROM t1 WHERE ID=3
    SET IDENTITY_INSERT t1 OFF

    SET IDENTITY_INSERT c1 ON
    INSERT INTO C1
    (
    ID
    )
    SELECT ID FROM dbo.g2 WHERE ID BETWEEN 50 AND 60
    SET IDENTITY_INSERT c1 OFF

    4.创建临时表,临时表上修改标识ID,再插入现有表格。

        select * into userTemp from user where 1<>1      --复制表结构

     ALTER TABLE user
    ADD NEW_ID INT
    GO
    UPDATE user SET NEW_ID=ID      --以前的增加一个字段,保留原有标识ID,便于后期维护用
    GO

    SET IDENTITY_INSERT C_StockUp_PackingTemp ON
    INSERT INTO C_StockUp_PackingTemp
    (
    ID,
    StockUpId,
    Packing,
    PackingNumb,
    PackingSM,
    NEW_ID
    )
    SELECT
    ID,
    StockUpId,
    Packing,
    PackingNumb,
    PackingSM,NEW_ID FROM C_StockUp_Packing
    SET IDENTITY_INSERT C_StockUp_PackingTemp OFF


    --需要手动建主键,去标识符号

    DECLARE @ID INT
    DECLARE @i INT
    SET @i=0
    DECLARE cur_g5 CURSOR FOR SELECT id FROM G5 ORDER BY id
    OPEN cur_g5
    FETCH NEXT FROM cur_g5 INTO @ID
    WHILE @@FETCH_STATUS=0
    BEGIN
    --PRINT CONVERT(VARCHAR,@ID)+'--'+CONVERT(VARCHAR,@i)+'--'+CONVERT(VARCHAR,@ID+@i)
    UPDATE C_StockUp_PackingTemp SET ID=ID+1 WHERE ID>@ID+@i
    SET @i=@i+1
    FETCH NEXT FROM cur_g5 INTO @ID
    END
    CLOSE cur_g5
    DEALLOCATE cur_g5

    --DELETE FROM C_StockUp_Packing WHERE ID>81847

    SET IDENTITY_INSERT C_StockUp_Packing ON
    INSERT INTO C_StockUp_Packing
    (
    ID,
    StockUpId,
    Packing,
    PackingNumb,
    PackingSM,NEW_ID
    )
    SELECT
    ID,
    StockUpId,
    Packing,
    PackingNumb,
    PackingSM,NEW_ID FROM C_StockUp_PackingTemp WHERE ID>93304
    SET IDENTITY_INSERT C_StockUp_Packing OFF

    GO

    5.MSSQL有做发布订阅如何追加历史标识ID

    发布订阅服务器系统默认两套数据库的ID阈值不一致,合并后数据库会有很多间隙ID可以直接插入。

    sp_adjustpublisheridentityrange @table_name='表名'    --ID冲突时设置表重新获取最新的阈值范围

     sp_helpconstraint '表名'       --查看表的约束条件;获取表的取值范围。

    dbcc checkident('表名',reseed,182831)     --设置标识ID的现在最大值。

    以上几点我入坑很久都没有办法解决追加历史ID的功能。

    其实方法很简单

    alter table 表名 nocheck constraint all         --禁用约束条件

    导入写好数据信息

    alter table 表名 check constraint all             --启用约束条件

    你的一分支持,是我坚持创作的十分动力。 如果文章的内容对你有帮助的话,请用微信扫描下方二维码,支持一下。谢谢! wechat1
  • 相关阅读:
    show processlist 输出ID 和 information_schema.PROCESSLIST 的id,information_schema.innodb_trx的TRX_MYSQL_T
    用 Flask 来写个轻博客 (15) — M(V)C_实现博文页面评论表单
    第十二章 对象(下)
    十大最值得关注的国内大数据分析厂商
    第十二章 对象(上)
    mysql 区间锁 对于没有索引 非唯一索引 唯一索引 各种情况
    insert into select 堵塞update
    监控持有sql和被堵塞的sql
    人生应该有间隔年——北漂18年(75)
    ERROR: transport error 202: connect failed: Connection timed out
  • 原文地址:https://www.cnblogs.com/shuilong/p/8535145.html
Copyright © 2020-2023  润新知