SQL 代替触发器

Posted

技术标签:

【中文标题】SQL 代替触发器【英文标题】:SQL instead-of trigger 【发布时间】:2013-01-26 13:13:46 【问题描述】:

我有这些表:

电影(mID、片名、年份、导演) 审阅者(rID,姓名) 评分(rID、mID、星数、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 的标题属性。我该怎么做?我不习惯触发和查看太多:(

【问题讨论】:

你在斯坦福数据库课上发布了这个问题吗?如果是的话,荣誉代码,是吗? 【参考方案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 颗星的 movie 或仅允许实际拥有的 record 更新标题超过 2 星?我的代码是前一种选择)。

【讨论】:

非常感谢,但只有一个问题。如何让它只更新 LateRating 中评论大于 2 的电影。 Anton 你有 MSN 帐户或我可以联系你的东西吗?我有几个类似的问题。

以上是关于SQL 代替触发器的主要内容,如果未能解决你的问题,请参考以下文章

sql sever的sql语句有关存储过程与触发器

mysql中的“代替”触发器

sql server而不是使用插入的变量和值触发插入语句

插入视图,代替触发器,身份,多个表?

Triggers:代替/For Insert,哪个会先触发?

Postgres视图中的默认值,触发代替更新