【问题标题】:mysql trigger does not insert selected columnsmysql触发器不插入选定的列
【发布时间】:2019-09-06 18:15:46
【问题描述】:
CREATE DEFINER=`ir55`@`%` TRIGGER UpdateAverageBookRating
AFTER INSERT
ON Reviews FOR EACH ROW
BEGIN
DECLARE AverageRating double;
DECLARE lastbookid int;
SELECT BookID FROM Reviews WHERE ReviewID = LAST_INSERT_ID() INTO lastbookid;
SELECT AVG(Rating) FROM Reviews WHERE BookID = lastbookid INTO AverageRating;
UPDATE CentralCatelogue SET Rating = AverageRating WHERE BookID = lastbookid;
END

上述触发器不会更新 CentralCatelogue 中的 Rating 列,因为 Rating 和 BookID 的值为空。

不知道为什么,我尝试使用静态值更新评级并且它有效,我认为选择“评论”中的列并将它们分配给变量有问题。

感谢您的帮助。 谢谢

【问题讨论】:

  • last_insert_id 可能是 bookid 吗?

标签: mysql sql database-trigger


【解决方案1】:

如果你的架构看起来有点像这样

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)

顺便说一句,我不太喜欢这个触发器,因为它会针对每一行进行测试和计算。如果将插入和更新封装在事务中可能会更好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-13
    • 1970-01-01
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多