SQL触发器 - 使用sum更新表A(tableB.col)WHERE tableA.userID = tableB.userID

时间:2017-03-21 00:26:28

标签: mysql sql database triggers

我是一位非常新的数据库学生......

我有两张桌子。用户和旅行。

每当一个新的Trip被添加到数据库时,我希望它在" totalMiles"中触发对User表的更新。柱。我希望它采用Trip.userID并更改" totalMiles"中的值。仅具有与Trip.userID条目相同的User.userID的用户的列。

我希望它从" tripMiles"中获取总和。 Trip.userID = User.userID。 userID是User表中Trip表中的外键。

现在我只有:

CREATE DEFINER='root'@'localhost'TRIGGER 'DATABASE'.'Trip_AFTER_INSERT' 
AFTER INSERT ON 'Trip' FOR EACH ROW
BEGIN
UPDATE User
SET totalMiles=sum(tripMiles)
WHERE Trip.userID = User.userID;
END

我得到的错误是"未知栏' Trip.userID'在' where子句'。

我在谷歌搜索并搜索了几个帖子,但我没有找到任何东西。

2 个答案:

答案 0 :(得分:0)

只需将clausule上的de“User.userID”更改为“NEW.userID”

即可

“新”对象意味着您的新TRIP已添加...

这样的事情:

CREATE TRIGGER 'Trip_AFTER_INSERT'
AFTER INSERT ON 'Trip' FOR EACH ROW
BEGIN
UPDATE User
SET totalMiles=sum(tripMiles)
WHERE User.userID = NEW.userID;
END

如果您需要更多信息,请参阅此处的文档:

https://dev.mysql.com/doc/refman/5.7/en/trigger-syntax.html

在这里

How to program a MySQL trigger to insert row into another table?

答案 1 :(得分:0)

您的语句存在多个问题,从单引号开始。一种方法是重新计算总和:

CREATE TRIGGER DATABASE.Trip_AFTER_INSERT 
AFTER INSERT ON Trip FOR EACH ROW
BEGIN
    UPDATE User u 
        SET totalMiles = (SELECT sum(t.tripMiles) FROM Trip t WHERE t.userId = u.userId)
        WHERE u.userID = new.userID;
END;
但是,这太过分了。如果totalMiles之前是正确的,那么只需调整值:

CREATE TRIGGER DATABASE.Trip_AFTER_INSERT 
AFTER INSERT ON Trip FOR EACH ROW
BEGIN
    UPDATE User u 
        SET totalMiles = u.totalMile + new.tripMiles - old.tripMailes; 
        WHERE u.userID = new.userID;
END;