数据库正经操作之——可重复执行的update脚本原创
金蝶云社区-i求知若渴
i求知若渴
12人赞赏了该文章 1,631次浏览 未经作者许可,禁止转载编辑于2020年03月30日 18:06:54

在更新数据的时候,我们当然需要小心翼翼。

有时候会遇到需要更新金额数据,在原来的金额基础上调整部分金额的情况,为了保证数据安全性,建议在写SQL的时候采用可重复执行的方式(避免因为误操作脚本执行多次而造成金额异常,特别是脚本不亲自执行发给他人执行的情况)。

举例:T_HS_INIVBALANCE_H  从2018-1期开始补充1分钱的差额(注意存货核算有16个相关的余额表,在此只是作为举例拿一个出来,并非更新存货核算余额的完整方案)

步骤一:收集需要更新的金额(数据放在表中方便批量修改)

select FENTRYID,FDIMEENTRYID,-0.01 fdiffamount into chl_hs_adjust0327002 from    T_HS_INIVSTOCKDIMENSION    where fentryid=179721

步骤二:备份余额数据(数据量比较大的表备份修改到的数据,如果数据量不大,则直接全表备份最好)

select a.* into T_HS_INIVBALANCE_H0327bak002  from T_HS_INIVBALANCE_H  a join T_HS_OUTACCTG b on a.fid=b.fid and a.FDIMENSIONID=1 

join   chl_hs_adjust0327002 c on a.FDIMEENTRYID=c.fentryid and fyear*100+FPERIOD>=201801

步骤三:更新的时候,利用备份表中的数据,写成可以重复执行的方式

--执行更新(全表备份时)

update a set a.FAMOUNT=c.fdiffamount+v.FAMOUNT    from T_HS_INIVBALANCE_H  a join T_HS_OUTACCTG b on a.fid=b.fid and a.FDIMENSIONID=1 

join   chl_hs_adjust0327002 c on a.FDIMEENTRYID=c.fentryid and fyear*100+FPERIOD>=201809

join T_HS_INIVBALANCE_H0327bak002 v on a.FENTRYID=v.FENTRYID

--执行更新(只备份需要修改的数据时)

update a set a.FAMOUNT=c.fdiffamount+v.FAMOUNT    from T_HS_INIVBALANCE_H  a 

join   chl_hs_adjust0327002 c on a.FDIMEENTRYID=c.fentryid

join T_HS_INIVBALANCE_H0327bak002 v on a.FENTRYID=v.FENTRYID

上面脚本即使重复执行也是相同的效果,相比之下,如果使用下面语句

update a set a.FAMOUNT=a.FAMOUNT+v.FAMOUNT    from T_HS_INIVBALANCE_H  a join T_HS_OUTACCTG b on a.fid=b.fid and a.FDIMENSIONID=1 

join   chl_hs_adjust0327002 c on a.FDIMEENTRYID=c.fentryid and fyear*100+FPERIOD>=201809

则只能执行一次,再次执行就相当于在原来的基础上调整了两分钱。


赞 12