SQL而不是触发器和更新

时间:2013-01-27 16:53:39

标签: sql sqlite triggers sql-update

我有这些表格:

  • 电影(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)  
    

这是我的数据集:https://prod-c2g.s3.amazonaws.com/db/Winter2013/files/viewmovie.sql

我被要求编写一个替代触发器,它可以更新视图LateRating的Stars属性。这是我的方法。

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

它给出了几乎正确的答案,但是只有一个错误的行,即201 101 4 2011-01-27.4应该是2.出了什么问题?

1 个答案:

答案 0 :(得分:1)

让我们看一下你的WHERE条件:

...AND Rating.mID IN (SELECT stars FROM Rating WHERE stars > 2)

它声明Rating.mID应该是从评级中选择的stars值。我不确定这里的目的是什么。假设你想要修改星星的任何尝试都要减少2的星数(这很奇怪:如果原始<,那么你将把增加星星的查询变成一些不相关的查询) / em> Rating表的行中的星数大于2。

CREATE trigger update_LateRating_stars INSTEAD OF 
UPDATE OF stars ON LateRating
BEGIN
  UPDATE Rating SET stars = stars - 2 
  WHERE Rating.mID = old.mID 
  AND Rating.stars > 2;
END;

同样,对你想要的东西有很多可能的解释,和 它们都或多或少很奇怪mID中的LateRating字段不是 足以识别Rating中的原始记录(可能是rID和 如果你不允许同一个评论者,mID就足够了 同时对同一部电影持不同意见。)