一个关于触发器性能的疑问

deninghe 2007-08-25 04:27:55
俺有3个表,a(相册表),b(图片表),c(评论表)
当在程序里删除多张b表的图片时,执行b上的触发器
    select @aid = aid from deleted --相册id
select @pid = pid from deleted --图片id
    update a set anum=anum - 1 where aid=@aid
delete from c where pid = @pid --删除c(评论表)表中此图片的评论
c(评论表)上有触发器
update b set premark = premark - 1 from b join deleted d on hl_ualbumpic.pid = d.pid
--有可能的删除方式 如delete from tab where id in(...)
-----------
这样当删除b的图片时c上触发器又回来给b表相应的图片减少一个评论数,而此时b表该图片pid可能已经不存在了
如此循环会不会对性能有很大的损失
刚弄触发器不久,写了很多,现在回头发现很多类似的这种有点矛盾的地方
...全文
182 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
netfound 2007-08-27
  • 打赏
  • 举报
回复
算是明白一点了。

你的担心是多余的了,想想看:在表B上的触发器,删除图片会删除这个图片所有的评论。然而你要去删除评论,这个时候,图片一定是存在。
deninghe 2007-08-27
  • 打赏
  • 举报
回复
update b set premark = premark - 1 from b join deleted d on hl_ualbumpic.pid = d.pid
这个是c(评论表)上的触发器
删除评论的时候当然要更新图片拥有的评论数量啊
netfound 2007-08-27
  • 打赏
  • 举报
回复
图片都被删除了,你还更新图片拥有的评论数量???

我想你的意思是更新图片所在相册的评论数量吧?
deninghe 2007-08-27
  • 打赏
  • 举报
回复
这样对性能有很大的影响吗?
winstonbonaparte 2007-08-25
  • 打赏
  • 举报
回复
触发器允许递归调用,有时候如果你写的语句有问题,就会超出所允许的最大32层递归

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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