开发工具与关键技术:存储过程
作者:邓崇富
撰写时间:2019 年8 月 7 日
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
存储过程的多表修改的原理和SQL多表修改的原理基本上是相同的,在存储过程里写多表修改时也需要一个必备条件就是一个ID或者是在字表里是唯一性的字段(在每一个子表里的所有数据中它都是唯一性的,就象每个表的主键ID,主键ID在每个表里都是自增并且是唯一性的);然后根据项目里传过来的这个条件,在子表查出该条数据,再根据该条数据查出父表的外键ID,再根据这个外键ID去查出父表的主键ID相等的那条数据,然后先修改父表里面的数据,父表数据修改完后,再返回来修改字表的数据,其他父表也是同理这样修改(当然要在子表和父表的关系是一对多的情况下才用这种方法);如果子表和父表是一对一的关系(或者是链式关系),先用项目中传过来的条件ID查出子表的该条数据,再用该条数据里的外键ID去查出父表主键相同的数据,以此类推,直到查出最底层那个父表的数据后,先修改最底层哪个父表的数据,然后再一步步往回修改表的数据即可(修改的顺序刚好和上面所说查询的顺序相反)。
下面是子表和父表是一对多关系的修改的详细的存储过程代码:
---保存修改费用种类信息
IF(@type='SaveUpdataCostCategory')
BEGIN
begin
Declare @CID int
select @CID = CurrencyCategoryID from SYS_ScheduleOfChar
where ScheduleOfChargesI = @ScheduleOfChargesID
update SYS_CurrencyCatego
set CurrencyCode = @CurrencyCode
where CurrencyCategoryID = @CID
update SYS_ScheduleOfChar
set TheDefaultCode = @TheDefaultCode, ChineseName = @ChineseName,EnglishName = @EnglishName, TheDefaultUP = @TheDefaultUP, Collect = @Collect, Payment = @Payment, Commission = @Commission, SalesHiding = @SalesHiding
where ScheduleOfChargesI = @ScheduleOfChargesID
end
END
代码的说明:Declare @CID int 是为了存放从子表里查出父表的外键ID声明一个变量@CID(一个存储过程中只能声明依次该变量名,即可以在多条存储语句中使用该变量);该select @CID = CurrencyCategoryID from SYS_ScheduleOfChar 语句中的SYS_ScheduleOfChar是子表,CurrencyCategoryID是子表中外键ID;这个条件语句 where ScheduleOfChargesI = @ScheduleOfChargesID里的@ScheduleOfChargesID是项目中传过来的条件;该update SYS_CurrencyCatego set CurrencyCode = @CurrencyCode where CurrencyCategoryID = @CID语句是修改父表数据语句,其中SYS_CurrencyCatego是父表,@CID是上面查出来的外键,CurrencyCategoryID是父表的主键;该update SYS_ScheduleOfChar
set TheDefaultCode = @TheDefaultCode, ChineseName = @ChineseName,EnglishName = @EnglishName, TheDefaultUP = @TheDefaultUP, Collect = @Collect, Payment = @Payment, Commission = @Commission, SalesHiding = @SalesHiding
where ScheduleOfChargesI = @ScheduleOfChargesID语句是修改子表数据的,其中SYS_ScheduleOfChar是子表,条件里的ScheduleOfChargesI是子表的主键ID或者是子表的唯一性的字段,@ScheduleOfChargesID是项目里传过来的条件。
存储过程里的多表删除也有很多中的写法,而我比较推荐的就是下面我介绍的这种写法,就是先删除父表再删除子表。多表删除的原理和多表修改的原理都是差不多的,只是关键字不一样罢了。在存储过程里写多表删除时也需要一个必备条件就是一个ID或者是在字表里是唯一性的字段(在每一个子表里的所有数据中它都是唯一性的,就象每个表的主键ID,主键ID在每个表里都是自增并且是唯一性的);然后根据项目里传过来的这个条件,在子表查出该条数据,再根据该条数据查出父表的外键ID,再根据这个外键ID去查出父表的主键ID相等的那条数据,然后先删除父表的数据,再删除子表的数据,其他父表也是同理这样删除(当然要在子表和父表的关系是一对多的情况下才用这种方法);如果子表和父表是一对一的关系(或者是链式关系),先用项目中传过来的条件ID查出子表的该条数据,再用该条数据里的外键ID去查出父表主键相同的数据,以此类推,直到查出最底层那个父表的数据后,先删除最底层哪个父表的数据,然后再一步步往回删除表的数据即可(删除的顺序刚好和上面所说查询的顺序相反)。这种多表删除方法的好处就是删除后,数据表中不会出现冗余数据。
下面是子表和父表是一对多关系的删除的详细的存储过程代码:
--删除船名/船次信息
IF(@type='DeleteShip')
BEGIN
select @CID = ShipsNameID from PW_ShipsName
where ShipsNameID = @ShipsNameID
Delete PW_ShipDate
where ShipsNameID = @CID
DELETE PW_ShipsName
WHERE ShipsNameID=@ShipsNameID
END
说明:为了保证父表不会出现冗余数据,必须要先删除父表的数据,再删除子表的数据;如果是先删除子表的数据,父表里数据就无法删除了。