为什么这个查询不起作用

时间:2017-12-02 23:02:31

标签: mysql

我是SQL的新手,所以我不明白为什么这个查询不起作用。提前谢谢

CREATE VIEW temp AS
SELECT return_date_time, renting_date_time
FROM renting;

CREATE TRIGGER charge_calc AFTER UPDATE ON renting.return_date_time
FOR EACH ROW
BEGIN
    UPDATE renting
    SET new.charge =(select m.charge_per_day 
             from movies m,renting as r 
             where (m.id=r.id_movie))*datediff(temp.return_date_time,temp.renting_date_time);
END

DATA DIAGRAM

1 个答案:

答案 0 :(得分:0)

我认为你不应该以这种方式更新收费;如果你想在因为行已经更新而触发的触发器中设置行的值,那么你需要做的只是

SET new.columnname = somevalue

在更新的行上设置columnname的值。您不会在更新表时触发更新触发器中的表的另一次更新。

接下来,您似乎正在加入电影中的所有行以及租借中的所有行,这肯定会返回数百或数千行,并且您尝试设置一个值。这是破碎的逻辑:你想让MySQL选择数千个电影行中的哪一个?它不会选择;逻辑被打破了

退一步考虑:这是租借表的更新触发器。它会针对更新的每一行触发,并且new.说明符可以访问正在更新的行。有一个new.movi​​e_id属性 - 这是正在更新的电影的ID。如果您想从电影表中删除一些数据,请根据新行(正在更新的行)中的电影ID选择它。 new.movi​​e_id

您也不需要临时视图 - 如果您想知道返回日期,肯定这也是new.行的一部分

全押,这个触发器应该是沿着以下想法的单行:

SET new.charge = (select rate from movies where id = new.movie_id) * datediff(date_rented, date_returned, day)

作为旁注,我认为前端应用应该这样做,而不是数据库中的触发器