My Life My Dream!

守信 求实 好学 力行
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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

Posted on 2007-08-15 14:41  召冠  阅读(537)  评论(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

-- 完成