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

lyz84331 2007-03-05 07:02:23
请教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
请问为什么????
请教解决办法
...全文
428 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
LYZ84330 2007-03-09
  • 打赏
  • 举报
回复
把你级联删除的触发器写在你自动更新编号触发器的前面就OK了...
lyz84331 2007-03-09
  • 打赏
  • 举报
回复
不是你的错....我用游标重写'Province_UpdatePRID_Del'后,还是出现相同的情况
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 Province_UpdatePRID_Cur cursor for select * from Province order by PRID
open Province_UpdatePRID_Cur
declare @prid int
declare @prcn varchar(200)
declare @pren varchar(200)
declare @stid int
declare @newprid int
set @newprid=1
fetch next from Province_UpdatePRID_Cur into @prid,@prcn,@pren,@stid
while @@fetch_status=0
begin
update Province set PRID=@newprid where PRID=@prid
set @newprid=@newprid+1
fetch next from Province_UpdatePRID_Cur into @prid,@prcn,@pren,@stid
end
deallocate Province_UpdatePRID_Cur

当我们把国家表中的中国给删除的时候,更新国家表中的数据,美国的STID便变成了1,触发器State_Province_Del又把Province中的美国下的省给全部删除掉....
涉及一个触发器优先级的问题....
有没有人知道触发器怎样定义优级啊????
lyz84331 2007-03-09
  • 打赏
  • 举报
回复
xiangjin0106
你写的给了我个提示,我用游标控制可以解决...
你的方法在删除某国家的时候,省的记录就没办法按顺序排列起来了...
xiangjin0106 2007-03-08
  • 打赏
  • 举报
回复
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
lyz84331 2007-03-08
  • 打赏
  • 举报
回复
忘记把表结构发上去了...是我糊涂.....
--创建国家表
if exists(select * from sysobjects where name='State')
drop table State
go
create table State
(
STID int primary key, --国家编号
STCN varchar(200) not null unique, --国家中文名称
STEN varchar(200) not null unique --国家英文名称
)
go
--创建省表
if exists(select * from sysobjects where name='Province')
drop table Province
go
create table Province
(
PRID int primary key, --省编号
PRCN varchar(200) not null unique, --省中文名
PREN varchar(200) not null unique, --省英文名
STID varchar(200) not null --国家编号
)
--创建城市表
if exists(select * from sysobjects where name='City')
drop table City
go
create table City
(
CIID int primary key, --城市编号
CICN varchar(200) not null UNIQUE, --城市中文名称
CIEN varchar(200) not null unique, --城市英文名称
STID int not null, --国家编号
PRID int not null --省编号
)
go
lyz84331 2007-03-08
  • 打赏
  • 举报
回复
能具体说说什么地方不好吗???
lyz84331 2007-03-06
  • 打赏
  • 举报
回复
随便删除一个国家的值,就会影响到一大堆省的级联删除(顺便说下,省与国家之间,我写有触发器实现他们的外键关系,感觉这样比较灵活)
--为State创建delete触发器,级联删除Province表中的数据
if exists(select * from sysobjects where type='tr' and name='State_Province_Del')
drop trigger State_Province_Del
go
create trigger State_Province_Del
on State
for delete
as
declare @STID int
select @STID=STID from deleted
delete Province where STID=@STID
go
lyz84331 2007-03-06
  • 打赏
  • 举报
回复
为什么这样的语句只适合删除一个省份...
显然删除一个省份就目前看来并不满足需求....
请大家提供删除多个省份,仍然可以自己排序的方法...
并就为什么这样的语句只能删除一个省份做出解释...谢谢
新鲜鱼排 2007-03-06
  • 打赏
  • 举报
回复
删除一定是单条处理。
这个表的结构设计得不好。
wangdehao 2007-03-06
  • 打赏
  • 举报
回复
create trigger State_Province_Del
on State
for delete
as
declare @STID int
delete Province from Province,deleted where Province.STID=deleted.STID
go
lyz84331 2007-03-06
  • 打赏
  • 举报
回复
冷箫轻笛 2007-03-05
  • 打赏
  • 举报
回复
--以下语句只适合每次只删除一个省份的时候
create trigger Province_UpdatePRID_Del
on Province
for delete
as
begin
update Province set PRID = PRID - 1
from delete a
where Province.PRID > a.PRID
end
go

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧