当删除一条记录时,更改表中字段的内容?
当删除一条记录时,更改表中字段的内容?
现在的需求是这样的:
比如说有表a如下:
cid c_no
1 20090501
2 20090502
3 20090503
当删除表中第一条记录时,第二条和第三条中的c_no就变成20090501,20090502
觉得好像需要使用游标才能搬到,请高手给指点一下,谢谢啦!
[解决办法]
- SQL code
if object_id('tb') is not nulldrop table tbgocreate table tb(cid int,c_no varchar(8))insert tb select 1,'20090501'insert tb select 2,'20090502'insert tb select 3,'20090503'insert tb select 4,'20081231'select * from tb--创建触发器if object_id('tri_update') is not nulldrop trigger tri_updategocreate trigger tri_update on tbfor deleteasbegin declare @cid int select @cid=cid from deleted update tb set c_no=convert(char(8),dateadd(day,1,c_no),112) where cid>@cidendgo--删除cid=2delete from tbwhere cid=2--查看数据 select * from tb--删除触发器和表drop trigger tri_updatedrop table tb/*(1 行受影响)(1 行受影响)(1 行受影响)(1 行受影响)cid c_no----------- --------1 200905012 200905023 200905034 20081231(4 行受影响)(2 行受影响)(1 行受影响)cid c_no----------- --------1 200905013 200905044 20090101(3 行受影响)*/
[解决办法]
- SQL code
create table test(cid int ,c_no datetime)insert testselect 1, '20090501' union select 2, '20090502' union select 3, '20090503' create trigger t_teston test after delete asupdate test set c_no = dateadd(day,-1,c_no)from testdelete from test where c_no='20090501'select * from test---2 2009-05-01 00:00:00.0003 2009-05-02 00:00:00.000
[解决办法]
看来这个字段的值不必存于数据库,因为只是给人看的
不过用户可能需要以此字段来查找,所以又需要能被检索。
方案:
1、存储与显示:数据库里存 年月部分,配合 row_number()得序号字段,组合成该值以供查看。
2、检索:对于用户输入 20090512 之类的值,解析为年月以及序号,用 1的办法 取出带序号的记录集,
即可匹配。
[解决办法]
这个在财务软件中有用到,就是记账凭证号,当作废一张凭证后就要整理断号以保证号码的连续性,不过它有一个前提就是每个月必须结完账后才能做下一个月的,这样整理起来也就是一个月的数据量,对数据库压力不大,如果整个库每改一次都整理一次,有个几万十万的数据的时候,哭都哭不出来了!
[解决办法]