如果你的架构看起来有点像这样
DROP TABLE REVIEWS,CENTRALCATALOGUE;
CREATE TABLE `reviews` (
`bookid` int(11) DEFAULT NULL,
`rating` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `centralcatalogue` (
`bookid` int(11) DEFAULT NULL,
`rating` double(10,2) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
DROP TRIGGER IF EXISTS T;
DELIMITER $$
CREATE TRIGGER `t` AFTER INSERT ON `reviews` FOR EACH ROW BEGIN
DECLARE AverageRating double(10,2);
if not exists (select 1 from centralcatalogue where bookid = new.bookid) then
insert into debug_table(msg) values (concat('inserting:',new.bookid,':',new.rating));
insert into centralcatalogue values(new.bookid,new.rating);
else
SELECT AVG(Rating) FROM Reviews WHERE BookID = new.bookid INTO AverageRating;
insert into debug_table(msg) values (concat('updating',new.bookid,':',averagerating));
UPDATE CentralCatalogue SET Rating = AverageRating WHERE BookID = new.bookid;
end if;
END $$
delimiter ;
注 1) 测试和插入以查看 bookid 是否存在于 centralcatalogue 2) debug_table 辅助调试 3) 将 averagerating 更改为 double(10,2) 以避免四舍五入
插入
insert into reviews values(1,1),(1,2),(2,3);
产生
+--------+--------+
| bookid | rating |
+--------+--------+
| 1 | 1.50 |
| 2 | 3.00 |
+--------+--------+
2 rows in set (0.02 sec)
顺便说一句,我不太喜欢这个触发器,因为它会针对每一行进行测试和计算。如果将插入和更新封装在事务中可能会更好。