今天机缘巧合,无意听到别人闲聊,突发奇想设计一套系统来解决他们的痛点,待我进一步分析下如何执行。回到主题,最近修改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 --启用约束条件