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 代替触发器的主要内容,如果未能解决你的问题,请参考以下文章