триггер обновления с использованием MySQL - PullRequest
0 голосов
/ 26 марта 2012

У меня есть две таблицы:

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 ивидит, что если Balance любого Detail_ID изменяется, он ищет весь Balance с тем же Order_ID, а если все все 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

Теперь это, вероятно, ужасно неправильно.Будет здорово, если кто-нибудь сможет мне помочь!

1 Ответ

1 голос
/ 26 марта 2012

Ну, есть некоторые очевидные синтаксические проблемы. Вы можете попробовать что-то вроде этого:

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 будет обновляться дважды, если общий баланс равен нулю). Чтобы избежать этого, вы можете написать более сложный запрос с курсором, перебирающим обновленные записи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...