【MySQL】在一个trigger下实现insert or update 执行某语句块时失败

需求:创建触发器tri_OrderDetailInsertUpdate,当在 orderdetail表中插入或修改订单时,计算 orders表中相关订单的TotalPrice 。


CREATE TRIGGER tri_OrderDetailInsertUpdate
AFTER UPDATE OR INSERT ON orderdetail FOR EACH ROW
BEGIN
UPDATE orders
SET TotalPrice=(SELECT SUM(Amount*Price*Discount) FROM book JOIN orderdetail ON book.BookCode=orderdetail.BookCode GROUP BY orderdetail.OrderCode)
WHERE OrderCode=new.OrderCode
END;

报错:1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'OR INSERT ON orderdetail FOR EACH ROW
BEGIN
UPDATE orders
SET TotalPrice=(SEL' at line 2

img

https://blog.csdn.net/home_zhang/article/details/86590527 这篇文章中写的也是insert or update

img

因此到底有没有 insert or update 这种写法呢?我用着是报错,下载的Navicat也是最新版的

mysql不像oracle那样可以支持定义多个触发事件,不同触发事件就得建不同的触发器,下面是mysql触发器的创建语法

CREATE
    [DEFINER = user]
    TRIGGER [IF NOT EXISTS] trigger_name
    trigger_time trigger_event
    ON tbl_name FOR EACH ROW
    [trigger_order]
    trigger_body

trigger_time: { BEFORE | AFTER }

trigger_event: { INSERT | UPDATE | DELETE }

trigger_order: { FOLLOWS | PRECEDES } other_trigger_name

官方文档

官方用例

insert or update 没有这种写法。
Insert型触发器容:可能通过insert语句,load data语句,replace语句触发;
Update型触发器:可能通过update语句触发;
Delete型触发器:可能通过delete语句,replace语句触发。

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632