触发器解决外键约束问题

时间:2021-08-06 11:02:34

    触发器是与表事件有关的特殊存储过程。它不能直接被执行,必须为表上的增、删、改事件所触发。外键要比触发器更快,但是我们经常会遇见外键约束的问题,触发器能解决外键不能处理的复杂关系。下面是一个实践的例子:

一、背景

    在牛腩发布系统中,三个表(新闻类别、新闻、评论)之间的关系是一对多的关系,每个新闻类别可以有多条新闻,每条新闻可以有多条评论,主键为相应的id号,关系图如下:

触发器解决外键约束问题

    现在在表中填充如下几条数据,关系已经在图中标明:

触发器解决外键约束问题

    新进行操作“删除新闻类别表”中的任一条记录:

delete from category where id=14   

   报错delete语句与REFERENCE约束“   ”冲突:
触发器解决外键约束问题

  解决办法:建立一个触发器,

<span style="font-family:KaiTi_GB2312;font-size:18px;">ALTER TRIGGER [dbo].[trigCategoryDelete]
ON [dbo].[category]
AFTER Delete
AS
BEGIN
select * from deleted

END
</span>
   这样就允许删除新闻类别表中的记录了,但是删除的记录是没有下属新闻的新闻类别,如果有新闻类别又会报错

触发器解决外键约束问题

  所以给出直观图:

触发器解决外键约束问题

   向上图中如果删除新闻类别id=16的新闻(有下属新闻或评论的)必须这样编辑触发器:

ALTER TRIGGER [dbo].[trigCategoryDelete]
ON [dbo].[category]
instead of Delete
AS
BEGIN
declare @caId int
select @caId =id from deleted
--删除评论
delete comment where newsid in (select newsid from news where caId =@caId )
--删除新闻
delete news where caId =@caId
--删除类别
delete category where id=@caId
-- Insert statements for trigger here

END

  总结:在牛腩新闻发布系统中,触发器这集视频资料看了四遍才弄明白,发现sql sever的内容太多了,一个标点符号,一个词语都会影响到全局。越学越发现自己知道的太少,虽然在这里花费了点时间,但学到了很多知识还是很开心,吼吼~