现有表card,如图
每行的当前库存量根据领卡数和操作类型算出,比如:取出11,就是上一行的库存量 111减去11,即111-11=100;领入111,就是上一行的库存量2加上111,即2+111=113,其他行以此类推。
现在如果修改某一行的领卡数,然后就能更新修改后的库存量以及以后各行的库存量,请问用sql语句如何做到?
除了使用触发器,你也可以这样:
比如你要将id=37那一行的领卡数量修改成1
declare @id int=37, @new领卡数量 int=1 @tmp int; set @tmp = (select 领卡数量-@new领卡数量 from card where id=@id); update card set 当前库存量=(case when 操作类型='领入' then 当前库存量-@tmp else 当前库存量+@tmp end),领卡数量 = @new领卡数量 where id=@id; update card set 当前库存量=当前库存量-@tmp where id>@id;
完成此功能需要借助sql中的触发器 trigger
一.领取卡片
create trigger tg1 before insert on 表名 for each row
begin
declare max integer;
select 当前库存量 into max from 表名 where Id=new.领取卡数量;
if new.领取卡数量>max then
set new.领取卡数量=max;
end if;
update 表名 set 当前库存量=当前库存量-new.领取卡数量 where Id=new.领取卡数量;
end;
二.修改卡片
create trigger tg2 after update on 表名 for each row
begin
update 表名 set 当前库存量=当前库存量+(old.领取卡数量-new.领取卡数量) where Id=old.id;
end;