积极答复者
触发器级联删除。。三个表

问题
-
问题
1.第二个触发器,删除类别表的数据时候,把其下的帖子和评论都删除了,但是被删除的类别表的数据,刷新一下被删除的数据出现了
2.总是有问题,帮帮忙
3.删除类别表一条数据时候,系统说受外键约束,删除不了类别表数据(因为在删除类别表的时候,触发器只帮我删除了帖子表的一条数据,而不是同类的所有贴子,为什么?)
表1: --创建类别表 create table Category (ID int identity(1,1) not null , CategoryName varchar(50) not null primary key) 表2: --创建帖子表 create table Invitation (ID int identity(1,1) not null primary key, CategoryName varchar(50) not null, InvitationContent text not null) --创建外键 alter table Invitation add constraint FK_Invitation_Category foreign key(CategoryName)references Category(CategoryName) 表3: --创建评论表 create table Comment ( ID int identity(1,1) not null primary key, InvitationID int not null, CommentContent text not null ) --创建外键 alter table Comment add constraint FK_Comment_Invitation foreign key(InvitationID)references Invitation(ID) --触发器1.删除帖子时候连同其下的评论一起删除 create trigger DeleteInvtation on Invitation instead of delete as declare @ID varchar(50) select @ID=ID from deleted delete from Comment where InvitationID=@ID delete from Invitation where ID=@ID --触发器2 create trigger DeleteCategory on Category instead of delete as declare @CategoryName varchar(50) select @CategoryName=CategoryName from deleted delete from Invitation where CategoryName=@CategoryName delete from Category where CategoryName=@CategoryName .删除类别时候连同其下帖子和评论一起删除
- 已编辑 l口令卡 2011年5月21日 5:37
答案
-
你好,
这个错误信息很明显,你首先应该去理解外键约束的意义。在删除类别表前,你首先得删除帖子表里面对应的记录。
Best Regards,
Stephanie Lv
- 已标记为答案 WeiLin QiaoModerator 2011年5月31日 9:16
全部回复
-
INSTEAD OF 执行触发器语句,但不执行触发触发器的 SQL 语句,比如试图删除一条记录时,将执行触发器指定的语句,此时不再执行 delete 语句。
所以在触发器后面,在执行一次删除操作
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
ALTER trigger [DeleteInvtation] on [dbo].[Invitation] instead of delete
as
declare @ID varchar(50)
select @ID=ID from Deleted
delete from Comment where InvitationID=@ID
--在追加删除
delete from dbo.Invitation where ID=@ID
-
这个存储过程可以吧 。。但是怎么用触发器实现呢?
create procedure DeleteCategory
@CategoryName varchar,@InvitationID int
as
--删除评论
select @InvitationID=ID from Invitation where CategoryName=@CategoryName
delete from Comment where InvitationID=@InvitationID
--删除帖子
delete from Invitation where CategoryName=@CategoryName
--删除类别
delete from Category where CategoryName=@CategoryName -
加上
delete from dbo.Invitation where ID=@ID
句后,删除类别表一条数据时候,系统说受外键约束,删除不了类别表数据(因为在删除类别表的时候,触发器只帮我删除了帖子表的一条数据,而不是同类的所有贴子,为什么?)
你好,根据你提供的数据,进行了测试,这个触发器执行的结果是成功地删除了Comment 和 Invitation 两个表上InvitationID对应的记录,没有错误信息。而你描述的错误信息应该是Invitation 表上存在外键约束冲突。请你检查是否存在除Comment 表以外的其他表,与Invitation 表有外键约束。如果是的话,在删除Invitation 表记录之前,也应该先把对应的那个表的记录删除。
另,如maco提到的,这种情况不太适合使用触发器。
Best Regards,
Stephanie Lv
-
insert into Category(CategoryName)values('1') insert into Invitation(CategoryName,InvitationContent)values('1','111') --每个表插入一条数据就可以 insert into Invitation(InvitationID,CommentContent)values('1','111') insert into Category(CategoryName)values('1') insert into Invitation(CategoryName,InvitationContent)values('1','111') insert into Invitation(CategoryName,InvitationContent)values('1','111') --帖子表插入两条就不行了 insert into Invitation(InvitationID,CommentContent)values('1','111')
我新建了个test数据库来试过了
-
你好,
insert into Invitation(InvitationID,CommentContent)values('1','111') 这个句子是不正确的,根据你的意思,应该是要插入到表 Comment :insert into Comment (InvitationID,CommentContent)values('1','111') 。但是,你在表 Comment上创建的外键约束是把表Invitation的ID列和表Comment 的InvitationID的关联。所以,表Comment 的字段InvitationID取的不应该是CategoryName列的值,而是表Invitation的ID列的值。这个字段是IDENTITY类型的,你可以通过@@IDENTITY获取最后一次插入表Invitation的ID列的值:
insert into Category(CategoryName)values('1') insert into Invitation(CategoryName,InvitationContent)values('1','111') insert into Comment(InvitationID,CommentContent)values(@@IDENTITY,'111')
Best Regards,
Stephanie Lv
-
你好,
这个错误信息很明显,你首先应该去理解外键约束的意义。在删除类别表前,你首先得删除帖子表里面对应的记录。
Best Regards,
Stephanie Lv
- 已标记为答案 WeiLin QiaoModerator 2011年5月31日 9:16
-
唉!正确的第二个触发器
--2.删除类别时候连同其下帖子和评论一起删除 create trigger DeleteCategoryC on Category instead of delete as declare @CategoryName varchar(50) select @CategoryName=CategoryName from deleted delete from Comment where InvitationID in(select ID from Invitation where CategoryName=@CategoryName) delete from Invitation where CategoryName=@CategoryName delete from Category where CategoryName=@CategoryName
要删除第一个触发器才行,否则冲突()
谢谢大家的帮助!结贴
还是不用触发器,上面的存储过程我也写错了