Триггер «ПОСЛЕ ВСТАВКИ» не работает, после вставки, если я добавить значения в таблицы? - PullRequest
0 голосов
/ 07 апреля 2019

Назначение триггера:

Я должен + добавить некоторое число 50 к этому пользователю в таблицу money, где в таблице paym оба столбца table1 и table2 не пусты.

Например: у пользователя 'John' оба столбца не пусты и к нему добавлено 50 в таблице money.

Пример в таблице ниже:

таблица: paym

 ID        username        table1        Table2  
+-------+-------------+-------------+-----------+
|   1   |  John       |  Value      |    Value  |
+-------+-------------+-------------+-----------+
|   2   |  Alex       |  Null       |    Null   |
+-------+-------------+-------------+-----------+

Таблица: money

 ID      username      total_money      
+-------+-------------+-------------+
|   1   |  John       |     50      | 
+-------+-------------+-------------+
|   2   |  Alex       |     0       |
+-------+-------------+-------------+

Триггер ниже, отлично работает только тогда, когда мы вставляем все таблицы одновременно. Но это не работает, если вы вставляете только username две таблицы пустыми, а после вставки, если вы добавляете значения в пустых таблиц table1 и table2, триггеры на этом этапе не работают! Можем ли мы решить эту проблему ??? Триггер должен работать, даже если мы добавим значение в таблицу после вставки!

DELIMITER $$
CREATE trigger update_money_after_paym
AFTER INSERT ON paym
FOR EACH ROW
BEGIN
    IF (NEW.table1 IS NOT NULL AND NEW.table2 IS NOT NULL) THEN
        UPDATE money SET total_money = total_money + 50 WHERE username = NEW.username;
    END IF;
END;
$$
DELIMITER;

1 Ответ

0 голосов
/ 07 апреля 2019

Не тот триггер. Это триггер insert, поэтому он не вызывается для update.

Если вы хотите триггер update, определите его:

DELIMITER $$
CREATE trigger update_money_after_paym
AFTER UPDATE ON paym
FOR EACH ROW
BEGIN
    IF (NEW.table1 IS NOT NULL AND NEW.table2 IS NOT NULL) THEN
        UPDATE money m
            SET total_money = total_money + 50
            WHERE m.username = NEW.username;
    END IF;
END;
$$
DELIMITER;

Это может не совсем то, что вы хотите. Например, вы можете добавить 50, только если предыдущими значениями являются NULL:

DELIMITER $$
CREATE trigger update_money_after_paym
AFTER UPDATE ON paym
FOR EACH ROW
BEGIN
    IF (NEW.table1 IS NOT NULL AND NEW.table2 IS NOT NULL AND
        OLD.table1 IS NULL AND old.table2 IS NULL) THEN
        UPDATE money m
            SET total_money = total_money + 50
            WHERE m.username = NEW.username;
    END IF;
END;
$$
DELIMITER;
...