关于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了...