关于数据库中表同时更新的解决方法

    数据库中表的同时更新应该是比较常见的,因为我们在开发关于数据库系统的时候大多数时候都是

很多表有关联的,所以要更新一个表时,很多时候都要同时对其它一些表做操作,在我的工作中常遇到的

是同步新增,同步删除,同步更新等,一般我们采取的是触发器,这些操作常不需要对表的结构做什么修改

,而现在遇到的问题却不是这样的,下面看问题:
    问题提出:表table1有88703个记录,而且没有相同的记录,有唯一的主键,表table2有1992个记录,

其中table2的记录都来自于table1,那么分别在table1和table2中添加一个唯一能标识每个记录的id,

而且id这一列要在第一列.
    问题分析:现假设table1,table2有四列分别是a,b,c,d,其中a为主键,现在要在这两个表添加一列为

id,使添加后table1和table2的关系保持不变,即table2的id也是来自table1的,由于数据较多,所以要考

虑到效率问题,这样我们可以用游标实现,关于添加一列而且要在第一列这个问题应该不难,下面看解决

方案.
   解决方案:首先向表table1和table2添加一列id

alter table table1 add id int identity(1, 1)
alter table table2 add id int

  将它设为第一列

sp_configure 'allow updates',1
RECONFIGURE WITH override
go
UPDATE syscolumns SET colid=colid+1
WHERE id=object_id('table1 ')
update syscolumns set colid=1
where id=object_id('table1 ') and name='id'
go
sp_configure
'allow updates',0
RECONFIGURE WITH override

table2的设置方法也一样,只要将table1换为table2就行了, 其实还要其它方法可以实现的,如用临时表

等,这里就不再说明,有兴趣不防去试一下,下面就是要实现更新table2,使table2中的id和table1中的id

同步,这里用游标实现:

declare mycursor cursor for 
select table1.id,table2.id,table1.a,table2.a from table2
left join table1 on table1.a = table2.a
open mycursorfetch next from mycursor
while @@fetch_status =0
begin
update table2 set table2.id = table1.id from table1
where table2.a= table1.a
fetch next from mycursor
end
close mycursor
deallocate mycursor

到现问题已经解决了,可能还有其它更好的方法,但我这样实现应该说效率是比较高的.

posted @ 2008-11-04 10:32  幽梦新影  阅读(2524)  评论(7编辑  收藏  举报