我有两张桌子:
sales_order的
Order_ID Buyer_ID Emp_ID Status (ENUM)
1 2 3 P
Sales_Order_Details
Detail_ID Order_ID Quantity Item_ID Balance
1 1 10 3 10
2 1 20 6 5
我正在尝试创建一个触发器,在Sales_Order_Details表上查找更新,并看到如果任何Detail_ID的Balance更改,它会查找具有相同Order_ID的所有Balance,如果all all 0则更改其状态在Sales_Order表中订购'C'。
我是触发器的新手并且已经阅读了一些内容,但我对使用它们感到很困惑。
CREATE TRIGGER flag_order_complete AFTER UPDATE ON Sales_Order_Details
FOR EACH ROW
BEGIN
IF Balance = '0' THEN
UPDATE Sales_Order SET Status 'C' where Order_ID = old.Order_ID
END
现在这可能是非常错误的。如果有人能帮助我,那就太棒了!
答案 0 :(得分:1)
嗯,有一些明显的语法问题。您可以尝试这样的事情:
CREATE TRIGGER flag_order_complete AFTER UPDATE ON Sales_Order_Details
FOR EACH ROW
BEGIN
DECLARE total_balance INT(10);
SELECT SUM(Balance) INTO total_balance
FROM Sales_Order_Details
WHERE Order_ID = new.Order_ID;
IF (total_balance = 0) THEN
UPDATE Sales_Order SET Status = 'C' where Order_ID = new.Order_ID;
END IF;
END;
由于Sales_Order
子句,FOR EACH ROW
中的各个行可以多次更新(例如,如果两个具有相同Order_ID的行在同一时间更新)时间,如果总余额为零,Sales_Order
中的匹配记录将更新两次。您可以使用循环覆盖更新记录的游标编写更复杂的查询,以避免这种情况。