在更新数据的时候,我们当然需要小心翼翼。
有时候会遇到需要更新金额数据,在原来的金额基础上调整部分金额的情况,为了保证数据安全性,建议在写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
则只能执行一次,再次执行就相当于在原来的基础上调整了两分钱。
推荐阅读