dintan 发表于 2008-01-23 08:09

求助各位大俠,這種情況update語句如何寫?

有兩個表invmas和invmaskd的表結構相同,index也相同,唯一鍵欄位為itnbr。
由於表結構有100多個欄位,現在要用invmaskd更新invmas請問如何用update表達???
多謝!!

ivhb 发表于 2008-01-23 09:09

原帖由 dintan 于 2008-1-23 08:09 发表 http://bbs.chinaunix.net/images/common/back.gif
有兩個表invmas和invmaskd的表結構相同,index也相同,唯一鍵欄位為itnbr。
由於表結構有100多個欄位,現在要用invmaskd更新invmas請問如何用update表達???
多謝!!
一定要用update么?
给我感觉是你需要更新的栏位太多了。你不想一一写。其实可以用一个简单的脚本生成这个update语句。

如果可以用其他的办法。

select itnbr
from invmas
into temp tmp_invmas
;

delete from invmas
;

insert into invas
select
a.*
from invmaskd a, tmp_invmas b
where a.itnbr = b.itnbr
;

dintan 发表于 2008-01-23 10:06

回复 #2 ivhb 的帖子

多謝,大俠!
其實我也想到用delete表後,再insert,
但是由於invmas比較重要,而且系統一直在使用,且資料較多,如果delete的話,會影響系統使用的。
我是設想如果用update的話,至少系統還可以用

ivhb 发表于 2008-01-23 13:16

en。你可以用如下的步骤完成。

1. 建立一个表 invmas_1, 结构和invmas_1一样,包括约束,索引,primary key... (就是完全一样)
2.
insert into invmas_1
select
a.*
from invmaskd a, tmp_invmas b
where a.itnbr = b.itnbr
;

rename table invmas to invmas_bak;
rename table invmas_1 to invmas;

这个时间窗口应该很小。基本上不会影响到其他人。

如果你还是坚持要用update,那么你可能需要用一个procedure来做这个事情。
一次更新一条记录,然后提交。尽可能的缩短每次锁表的时间。
因为可能有其他的程序在实现上已经设定了wait的时间。超时导致访问失败,也是
影响了别人的使用。

以上建议仅供参考。个人倾向于先生成。然后rename。

dintan 发表于 2008-01-23 17:03

回复 #4 ivhb 的帖子

多謝,我想用此方法是最好的辦法啦!!

liaosnet 发表于 2008-01-23 17:29

原帖由 dintan 于 2008-1-23 17:03 发表 http://bbs.chinaunix.net/images/common/back.gif
多謝,我想用此方法是最好的辦法啦!!

当然这个方法也有些坏处..就是如果原表有update操作..新表将丢失部分信息........
页: [1]
查看完整版本: 求助各位大俠,這種情況update語句如何寫?