none
触发器级联删除。。三个表 RRS feed

  • 问题

  • 问题
    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
    
    .删除类别时候连同其下帖子和评论一起删除



    2011年5月20日 12:35

答案

  • 你好,

    这个错误信息很明显,你首先应该去理解外键约束的意义。在删除类别表前,你首先得删除帖子表里面对应的记录。

     


    Best Regards,
    Stephanie Lv

    2011年5月26日 9:59

全部回复

  • 此种情况不建议使用触发器。

    例如类别表,帖子表。删除某个类别需要先删除帖子中对应类型的数据。

    删除可以用存储过程处理,然后在删除的时候,根据帖子类别依次执行两个delete就可以了。

    触发器不便于维护,也不方便找错误。

    2011年5月20日 14:47
    版主
  • 我只是想知道触发器怎么,写出来,
    2011年5月20日 14:54
  • 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

    2011年5月21日 2:32
  • 加上

    delete from dbo.Invitation where ID=@ID

    句后,删除类别表一条数据时候,系统说受外键约束,删除不了类别表数据(因为在删除类别表的时候,触发器只帮我删除了帖子表的一条数据,而不是同类的所有贴子,为什么?)

    2011年5月21日 5:22
  • 加上

    delete from dbo.Invitation where ID=@ID

    句后,删除类别表一条数据时候,系统说受外键约束,删除不了类别表数据(因为在删除类别表的时候,触发器只帮我删除了帖子表的一条数据,而不是同类的所有贴子,为什么?)


    这个你需要理解外键是干嘛的,数据库使用外键是为了维护数据的完整性,所以你删除不了,必须将对应外键的那个表的数据删除了,才能删除当前表的这个数据。

     


    family as water
    2011年5月21日 5:31
  • 这个存储过程可以吧  。。但是怎么用触发器实现呢?

    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

     

    2011年5月21日 5:49
  • 加上

    delete from dbo.Invitation where ID=@ID

    句后,删除类别表一条数据时候,系统说受外键约束,删除不了类别表数据(因为在删除类别表的时候,触发器只帮我删除了帖子表的一条数据,而不是同类的所有贴子,为什么?)


    你好,

    根据你提供的数据,进行了测试,这个触发器执行的结果是成功地删除了Comment 和 Invitation 两个表上InvitationID对应的记录,没有错误信息。而你描述的错误信息应该是Invitation 表上存在外键约束冲突。请你检查是否存在除Comment 表以外的其他表,与Invitation 表有外键约束。如果是的话,在删除Invitation 表记录之前,也应该先把对应的那个表的记录删除。

    另,如maco提到的,这种情况不太适合使用触发器。


    Best Regards,
    Stephanie Lv

    2011年5月24日 3:22
  • 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数据库来试过了

    2011年5月26日 5:21
  • 你好,

    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

    2011年5月26日 6:39
  • 谢谢你,

    不好意思,打错了,也表达错误!

    我的意思是,当在贴子表插入两条以上数据(类别,评论表插入一条以上数据)的时候。。。。再去删除类别表的数据就会报错

    消息 547,级别 16,状态 0,过程 DeleteCategory,第 13 行
    DELETE 语句与 REFERENCE 约束"FK_Invitation_Category"冲突。该冲突发生于数据库"test",表"dbo.Invitation", column 'CategoryName'。

     

    2011年5月26日 9:42
  • 你好,

    这个错误信息很明显,你首先应该去理解外键约束的意义。在删除类别表前,你首先得删除帖子表里面对应的记录。

     


    Best Regards,
    Stephanie Lv

    2011年5月26日 9:59
  • 唉!正确的第二个触发器

    --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
    
    
    
    

    要删除第一个触发器才行,否则冲突()

    谢谢大家的帮助!结贴


    还是不用触发器,上面的存储过程我也写错了
    2011年6月4日 3:19