简单送分题,asp.net中的级联删除

mute_solo 2008-11-21 03:04:41
一个文章表一对多一个评论表,删除文章表同时删除评论表,问题一:请问有几种方法实现?问题二:我知道有触发器的方法,请您帮我写下触发器的代码。
...全文
157 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
freedomwing 2008-11-21
  • 打赏
  • 举报
回复
外键关联最方便了,只管删就是了。
mengxj85 2008-11-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hs1983 的回复:]


SQL code--WZ:文章表 ;WZID:文章ID
--PL: 评论表 ;PL_WZID:评论表中的文章ID
create trigger DeleteTest
on WZ for Delete
as

declare @WZID varchar(30)
begin
select @WZID=WZID from Deleted
Delete from PL where PL_WZID=@WZID
end
[/Quote]
JF
tinghai_xu 2008-11-21
  • 打赏
  • 举报
回复
同意11楼的,在实际的应用中,为了性能考虑很多时候都会要求不能使用外键关联和触发器,所以使用存储过程+事务是通用解决方法
模板:

declare @TranCnt int

SELECT @TranCnt = @@TRANCOUNT

IF @TranCnt > 0

SAVE TRANSACTION preSavePoint;

ELSE

BEGIN TRANSACTION;

BEGIN TRY

--delete 文章表
--delete 评论表

--- Commit Transaction

IF @TranCnt = 0 AND XACT_STATE() <> 0

COMMIT TRANSACTION

END TRY

BEGIN CATCH

IF XACT_STATE() <> 0

BEGIN

IF @TranCnt = 0

ROLLBACK TRANSACTION

ELSE

ROLLBACK TRANSACTION preSavePoint

END

END CATCH

  • 打赏
  • 举报
回复
SQL Server与Oracle的触发器的不同点就在后者是按照行处理的,而前者是按照记录集处理的。写触发器时如果只是假设inserted或者deleted中只有一条记录,这是有很大隐患的触发器程序。

另外,如果设置了外键关联,并且是cascade on delete,那么SQL Server自己会去删除关联的记录。不需要写触发器。
cc87654321 2008-11-21
  • 打赏
  • 举报
回复
用存储过程,或程序里面用事务控制。避免造成数据冗余
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hs1983 的回复:]


SQL code--WZ:文章表 ;WZID:文章ID
--PL: 评论表 ;PL_WZID:评论表中的文章ID
create trigger DeleteTest
on WZ for Delete
as

declare @WZID varchar(30)
begin
select @WZID=WZID from Deleted
Delete from PL where PL_WZID=@WZID
end
[/Quote]

写触发器的时候你不能假设只有一条记录,Deleted中会有多条记录。这个触发器只要一条代码就可以了,一个Inner join查询将被删除的PL与Deleted关联起来。
jiang_jiajia10 2008-11-21
  • 打赏
  • 举报
回复
两条删除语句就可以解决问题,搞的哪么麻烦干什么
syc958 2008-11-21
  • 打赏
  • 举报
回复
给两表关联一下不就可以了?
chinaxc 2008-11-21
  • 打赏
  • 举报
回复
触发器,主外链关联。
mute_solo 2008-11-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 baiyashan 的回复:]
给这么点分.我只能帮你顶一下.

[/Quote]

没看见小生可用分等级:赫然写着乞丐两个大字吗?
hao1hao2hao3 2008-11-21
  • 打赏
  • 举报
回复
create proc aa
@titleID int
as
delete from 评论表 where 文章ID=@title
delete from 文章表 where 文章ID=@title
go
hao1hao2hao3 2008-11-21
  • 打赏
  • 举报
回复
用存储过程,先通过文章ID删除评论,然后再删除文章。
xyq1986 2008-11-21
  • 打赏
  • 举报
回复
除了trigger也可以手工删除,就是删article的时候,先delete评论表里该文章的评论,再删article,
还有一种直接用数据库的级联删除功能,点一点就行了。不知你是用哪种数据库。
hs1983 2008-11-21
  • 打赏
  • 举报
回复

--WZ:文章表 ;WZID:文章ID
--PL: 评论表 ;PL_WZID:评论表中的文章ID
create trigger DeleteTest
on WZ for Delete
as

declare @WZID varchar(30)
begin
select @WZID=WZID from Deleted
Delete from PL where PL_WZID=@WZID
end
baiyashan 2008-11-21
  • 打赏
  • 举报
回复
给这么点分.我只能帮你顶一下.

62,269

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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