как проверить, если переменная равна нулю, и установить ее на ноль, если она равна нулю - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть две таблицы: Таблица Item List и Таблица Rekod. Я пытаюсь создать триггер, который будет обновлять количество определенного элемента c в таблице item_list, где бы ни обновлялась запись. Однако у меня проблема при вводе самой первой записи. Триггер не будет работать. Работает только тогда, когда уже есть добавленная и отрицательная запись. Я пытаюсь это сделать, но, похоже, я больше не могу обновить свою rekod таблицу

CREATE TRIGGER update_quantity AFTER UPDATE ON rekod
FOR EACH ROW
BEGIN
    DECLARE add INT;
    DECLARE minus INT;
    DECLARE final INT;
    SET add = 
SELECT (SELECT SUM(rekod.quantity) from rekod where rekod.status = "add" &&rekod.SKU=item_list.SKU )
FROM item_list ;
    SET minus = 
SELECT (SELECT SUM(rekod.quantity) from rekod where rekod.status = "minus" &&rekod.SKU=item_list.SKU )
FROM item_list ;
    IF add IS NULL
        THEN 
        SET add = 0;
    END IF;
    IF minus IS NULL
        THEN
        SET minus = 0;
    END IF;
    SET final = add - minus;
    UPDATE item_list SET Quantity = final;
END;
//
delimiter ;```

Ответы [ 2 ]

0 голосов
/ 04 апреля 2020

Этого должно быть достаточно, чтобы проверить каждую строку статуса и определить, следует ли добавить или вычесть

Как

DELIMITER //
CREATE TRIGGER update_quantity AFTER UPDATE ON rekod
FOR EACH ROW
BEGIN    
    IF NEW.status = "add"  THEN 
       SET  @add = NEW.quantity;
    ELSE
        SET  @add = - NEW.quantity;
    END IF;

    UPDATE item_list SET Quantity = Quantity + @add WHERE sku = new.sku;
END;
//
delimiter ;
0 голосов
/ 04 апреля 2020

Если есть веская причина, почему весь список времени должен синхронизироваться при обновлении rekod, например, «когда мы обновляем rekod, мы меняем 10000 строк за один раз»

CREATE TRIGGER update_quantity AFTER UPDATE ON rekod
BEGIN

    UPDATE 
      item_list
      INNER JOIN (SELECT sku, SUM(CASE WHEN status = 'add' THEN quantity ELSE -quantity END) as s FROM rekod) x
      ON x.sku = item_list.sku
    SET item_list.quantity = x.s;
END;
//
delimiter;

Или для сохранения списка элементов в формате syn c построчно, например, «мы обновляем только один элемент за раз в rekod»

CREATE TRIGGER update_quantity AFTER UPDATE ON rekod
FOR EACH ROW
BEGIN

    UPDATE 
      item_list
    SET quantity = (SELECT SUM(CASE WHEN status = 'add' THEN quantity ELSE -quantity END) as s FROM rekod WHERE sku = new.sku) 
    WHERE sku = new.sku;

END;
//
delimiter;

Не уверен, что вы делаете со вставками - я ' я бы подумал, что rekod работает как таблица истории, которая имеет длинную последовательность добавления и минус

Лично я бы просто складывал rekod каждый зуб, который хотел знать баланс, а не пытался поддерживать синхронизацию списка элементов. c

...