回 帖 发 新 帖 刷新版面

主题:delete触发器(主键)问题,急救,小第万分感谢

CREATE TABLE [news] 
(
    [ID] [int] IDENTITY (1, 1) NOT NULL primary key ,
    [Title] [varchar] (50) NOT NULL 

GO

CREATE TABLE [reply]
 (
    [ID] [int] IDENTITY (1, 1) NOT NULL  primary key,
    [newsID] [int] NOT NULL ,
    [contett] [varchar] (50) NULL 

GO

insert into news values('test_1')
insert into news values('test_2')

insert into reply values(1,'test')
insert into reply values(2,'test')

go
--test表触发器
drop TRIGGER [DeleteNews]

CREATE   trigger   [DeleteNews]   ON   news   
  FOR   DELETE     
  AS   
    
If @@ROWCOUNT>0   
BEGIN   
   delete   FROM   reply   WHERE   newsID  in( SELECT  id  FROM   DELETED )
END   


DELETE   FROM   news   WHERE   ID = 1

为什么有主键会不行?

回复列表 (共4个回复)

沙发

有主外键关系是不是不能触发?

板凳

你这样当然不行,你news里的ID是被reply中的newsID所引用,所以不能删除。所以必须改变你触发器的类型(for,after,instead of),自己去看一下这几种触发器的区别。
create trigger DeleteNews on news   
instead of delete     
as   
  if (select count(*) from deleted) > 0
  begin
    --先删除reply中的数据,再删除news中的数据
    delete from reply where newsID in (select newsID from deleted)
    delete from news where newsID in (select newsID from deleted)
  end
这样可以实现你需要的功能,不知道还有没有其他的办法

3 楼

1.

If @@ROWCOUNT>0
删除

2.
其实这不用触发器,两表建立关系,级联删除即可

4 楼

奥.知道了,谢谢啦!!!

我来回复

您尚未登录,请登录后再回复。点此登录或注册