My Life My Dream!

守信 求实 好学 力行
随笔 - 193, 文章 - 0, 评论 - 55, 阅读 - 34万
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

调整主建为自增、表内自关联的主建顺序

Posted on   召冠  阅读(538)  评论(0编辑  收藏  举报

问题: 调整主建为自增、表内自关联的主建顺序

解答:
-- 想用外键的级联修改,但表内自关联的方式不支持级联修改、删除

-- 还有另外一个办法,先将外键删除,再用触发器实现级联更新,然后再添加外键

-- 第三种方式:对欲修改的表中加入一个自增列,将数据导入一个临时表
select *, identity(int, 1, 1) as id into #t
from A

/*---上面的语句应该写成如下,因为 A表的OID为自增字段,不能再直接加上 identity(int, 1, 1) as id1
 select * into #tt1
 from A
 
 alter table #tt1 add id1 bigint
 
 update #tt1
 set id1 = OID
 
 alter table #tt1 drop column OID
 
 sp_rename '#tt1.id1', 'OID', 'column' -- 此处不能通过, 因为在当前数据库中是找不到 #tt1 表的,必须到 tempdb 下才能操作
 
 select *, identity(int, 1, 1) as id1 into #t -- 此处只能用  select id1, vName...., identity(int, 1, 1) as id2 into #t from #tt1
 from #tt1
 
 drop table #tt1
---*/

select * from #t

-- 然后设置外键关联的转变,从依赖于OID,转变为依赖自增的ID
update #t
set lParent = t.id2
from
(
 select t1.OID as id1, t1.lParent as lParent1, t2.id as id2
 from #t as t1 join #t as t2 on t1.lParent = t2.OID
) as t
where t.id1 = #t.OID

select OID, lParent, id
from #t


-- 删除表中所有行,并且将自动增值的列初始为种子值
truncate table A

-- 插入调整了顺序的数据
insert into A(字段列表)

from #t
order by id

select *
from tFunctions

-- 完成

编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示