SQL代替触发器

时间:2013-01-26 13:13:46

标签: sql sqlite triggers views

我有这些表格:

  • 电影(mID,标题,年份,导演)
  • 审稿人(rID,姓名)
  • 评级(rID,mID,stars,ratingDate)

和一些观点:

  • 查看LateRating包含2011年1月20日之后的电影评分。该视图包含电影ID,电影标题,星标数和评分日期。

    create view LateRating as 
      select distinct R.mID, title, stars, ratingDate 
      from Rating R, Movie M 
      where R.mID = M.mID 
      and ratingDate > '2011-01-20' 
    
  • 查看HighlyRated包含至少有一个等级超过3星的电影。该视图包含电影ID和电影标题。

    create view HighlyRated as 
      select mID, title 
      from Movie 
      where mID in (select mID from Rating where stars > 3) 
    
  • 查看NoRating包含数据库中没有评级的电影。该视图包含电影ID和电影标题。

    create view NoRating as 
      select mID, title 
      from Movie 
      where mID not in (select mID from Rating)  
    

这是我的数据集:http://dfiles.eu/files/vlylwacdd

我被要求编写一个替代触发器,它可以更新视图LateRating的title属性。我可以这样做吗?我不习惯触发和观察太多:(

1 个答案:

答案 0 :(得分:1)

这样的事情:

CREATE trigger update_LateRating_title INSTEAD OF UPDATE OF title ON LateRating
BEGIN
  UPDATE Movie SET title = new.title WHERE movie.mID = old.mID;
END;

根据评论中的要求,此处是触发器,仅更新LateRating中评论大于2的电影:

CREATE trigger update_LateRating_title INSTEAD OF 
UPDATE OF title ON LateRating
BEGIN
  UPDATE Movie SET title = new.title 
  WHERE movie.mID = old.mID 
  AND movie.mID IN (SELECT mID FROM LateRating WHERE stars > 2);
END;

(有不同的方法来解释这个后来的请求。如果电影允许标题更新,其中某个地方有超过2颗星,或者只有记录实际拥有超过2星?我的代码是前者的选择。)

相关问题