请高手来挑战,触发器每次只能删除一条数据
两个表建立了外键,在删除主表数据的时候我用了触发器先删除了从表中的含相关字段的数据,结果发现触发器每次只能删除从表中含主表中字段的一条数据,是什么原因?形如:在从表中有两条外键字段ID1为1的数据,那么我来删除从表中ID1为1的数据行,结果每运行一次只能删除一条,
触发器如下:
create trigger trDeleteDetailCate
on 主表
instead of delete
as
declare @cateDetailId int
select @cateDetailId =cateDetailId from deleted
delete 从表 where cateDetailId=@cateDetailId
我要怎么改进呢,是不是我在表的什么地方设置错了??

解决方案 »

  1.   

    不要将deleted的cateDetailId放到一个变量中.将它跟从表做join判断.然后deleted的cateDetailId和从表的cateDetailId关联.作删除操作.
      

  2.   

    delete a
    from 从表 as a
        join deleted as b
    on a.cateDetailId = b.cateDetailId
      

  3.   

    instead of触发器.还要对主表进行一次delete操作.
      

  4.   

    instead of触发器.还要对主表进行一次delete操作.
    在对从表没有完全删除以前对主表进行删除的话就出现了冲突,所以我就只测试了一下对从表的操作
      

  5.   

    create table Themes
    (
    ThemeID int primary key,
    ThemeName varchar(100),
    )create table Users
    (
    UserID int primary key,
    UserName varchar(100),
    ThemeID int constraint Users_ThemeID_FK references Themes(ThemeID) 
    )insert into Themes (ThemeID, ThemeName) values (1,'Default')
    insert into Themes (ThemeID, ThemeName) values (2,'Winter')insert into Users(UserID, UserName, ThemeID) values (1,'JSmith',1)
    insert into Users(UserID, UserName, ThemeID) values (2,'Ted',1)
    insert into Users(UserID, UserName, ThemeID) values (3,'Mary',2)GOCREATE TRIGGER tri ON Themes 
        INSTEAD OF DELETE
    AS
        --删从表
        DELETE A
        FROM Users AS A
            JOIN deleted AS B
        ON A.ThemeId = B.ThemeId;
        
        --删主表
        DELETE A
        FROM Themes AS A
            JOIN deleted AS B
        ON A.ThemeId = B.ThemeId;
    GODELETE Themes WHERE ThemeId=1SELECT * FROM Themes;
    SELECT * FROM UsersGO
    drop table users,themes
      

  6.   

    create table Themes
    (
    ThemeID int primary key,
    ThemeName varchar(100),
    )create table Users
    (
    UserID int primary key,
    UserName varchar(100),
    ThemeID int constraint Users_ThemeID_FK references Themes(ThemeID) 
                   on delete cascade --联级删除 
    )insert into Themes (ThemeID, ThemeName) values (1,'Default')
    insert into Themes (ThemeID, ThemeName) values (2,'Winter')insert into Users(UserID, UserName, ThemeID) values (1,'JSmith',1)
    insert into Users(UserID, UserName, ThemeID) values (2,'Ted',1)
    insert into Users(UserID, UserName, ThemeID) values (3,'Mary',2)GO
    DELETE Themes WHERE ThemeId=1SELECT * FROM Themes;
    SELECT * FROM UsersGO
    drop table users,themes
      

  7.   

    如果限制只能删除主表一个ID的时候.可以放到一个变量中.
    但如果删除多个ID时..得到的是个集合..那一个集合放到一个变量中.
    一个变量只存放一个值.那你是将这个集合的这些值的哪个放到这个变量中?.
      

  8.   

    请问一下,上面的on delete cascade 在代码中是上面那么的实现,那么我在表设计器中应该怎么加入这个属性到对应的列中呢?谢谢
      

  9.   

    呵呵,知道怎么设了,谢谢高手liangCK,谢谢了,你的第二种方法不仅有效而且方便,快速,呵呵,谢谢谢谢,困绕了我整整两天,在网上找了N多些资料都不行,真是在崩溃的边缘了,多谢了这位高手,谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢