读书人

关于delete删除某表中某些记录的原理有

发布时间: 2012-01-19 20:57:58 作者: rapoo

关于delete删除某表中某些记录的原理问题
请教delete删除某表中某些记录的原理是怎样的,是每条记录挨个删除还是以某中方式批量执行
下面的现象触发了上面的问题,请做出解释
有两张表
国家表State
1中国China
2美国America
3英国England
省表Province
1北京BeiJing1
2重庆ChongQing1
3四川SiChuan1
4纽约NewYork2
5伦敦London3
--为Province创建delete触发器,当删除某个省后,重新排列Province表的主键编号
if exists(select * from sysobjects where type= 'tr ' and name= 'Province_UpdatePRID_Del ')
drop trigger Province_UpdatePRID_Del
go
create trigger Province_UpdatePRID_Del
on Province
for delete
as
declare @PRID int
select @PRID=PRID from deleted
declare @tempID int
set @tempID=@PRID+1
while @tempID <=((select count(*) from Province)+1)
begin
update Province set PRID=@tempID-1 where PRID=@tempID
set @tempID=@tempId+1
end
执行
delete Province where STID=2后,得到理想结果
1
北京BeiJing12
重庆ChongQing13
四川SiChuan14
伦敦London33
然而当执行
delete Province where STID=1时
得到结果如下
4伦敦London3
请问为什么????
请教解决办法

[解决办法]
删除一定是单条处理。
这个表的结构设计得不好。
[解决办法]
if exists(select * from sysobjects where type= 'tr ' and name= 'Province_UpdatePRID_Del ')
drop trigger Province_UpdatePRID_Del
go
create trigger Province_UpdatePRID_Del
on Province
for delete
as
declare @PRIDMIN int
declare @PRIDMAX int
select @PRIDMIN=min(PRID),@PRIDMAX=MAX(PRID) from deleted
while @PRIDMIN <=(select count(*) from Province)
begin
update Province set PRID=@PRIDMIN where PRID=@PRIDMAX+1
set @PRIDMIN=@PRIDMIN+1
set @PRIDMAX=@PRIDMAX+1
end
[解决办法]
把你级联删除的触发器写在你自动更新编号触发器的前面就OK了...

读书人网 >SQL Server

热点推荐