日期:2014-05-18  浏览次数:20479 次

关于delete删除某表中某些记录的原理问题
请教delete删除某表中某些记录的原理是怎样的,是每条记录挨个删除还是以某中方式批量执行
下面的现象触发了上面的问题,请做出解释
有两张表
国家表State
1 中国 China
2 美国 America
3 英国 England
省表Province
1 北京 BeiJing 1
2 重庆 ChongQing 1
3 四川 SiChuan 1
4 纽约 NewYork 2
5 伦敦 London 3
--为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
北京 BeiJing 1 2
重庆 ChongQing 1 3
四川 SiChuan 1 4
伦敦 London 3 3
然而当执行
delete   Province   where   STID=1时
得到结果如下
4 伦敦 London 3
请问为什么????
请教解决办法

------解决方案--------------------
删除一定是单条处理。
这个表的结构设计得不好。
------解决方案--------------------
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了...