如何自动化每一行的rateAvg

userID pID rate1 rate2 rate3 rate4 rate5   rateCmmt     rateAvg
42      24  2     4      3    4     1      Lorem ipsum     0
45      25  3     4      4    2     1      Lorem ipsum     0


这是我尝试的代码。

DROP TRIGGER IF EXISTS `updateAVG`;
CREATE DEFINER=`root`@`localhost`
TRIGGER `updateAVG`
AFTER INSERT ON `tblrate`
FOR EACH ROW UPDATE tblrate SET `rateAvg` = ((`rate1`+`rate2`+`rate3`+`rate4`+`rate5`)/5)

最佳答案

您需要一个插入前触发器:

DROP TRIGGER IF EXISTS `updateAVG`;
CREATE DEFINER=`root`@`localhost` TRIGGER `updateAVG` BEFORE INSERT ON `tblrate`
FOR EACH ROW
BEGIN
    SET new.rateAvg = (new.rate + new.rate2 + new.rate3 + new.rate4 + new.rate5) / 5;
END;


您也可以使用以下视图执行此操作:

create v_updateAVG as
    select u.*, (u.rate + u.rate2 + u.rate3 + u.rate4 + u.rate5) / 5 as rateAvg
    from updateAVG;


或者,在MySQL 5.7.6+中作为生成的列:

alter table updateAVG add rateAvg as ((rate + rate2 + rate3 + rate4 + rate5) / 5);


后两种方法的优点是,在插入和更新之后,平均值始终是最新的。

10-05 22:51