@esskimos

Как правильно написать триггер на сумму чисел строки при появлении новой записи?

Нужен триггер, который, будет вписывать все поля с DECIMAL сумму в ячейку 'outcome'
Таблица:
CREATE TABLE maintable_pricetable (
    id           INTEGER       NOT NULL
                               PRIMARY KEY AUTOINCREMENT,
    transparency DECIMAL       NOT NULL,
    color        DECIMAL       NOT NULL,
    pis          DECIMAL       NOT NULL,
    purity       DECIMAL       NOT NULL,
    intensity    DECIMAL       NOT NULL,
    typicality   DECIMAL       NOT NULL,
    purity2      DECIMAL       NOT NULL,
    intensity2   DECIMAL       NOT NULL,
    persistence  DECIMAL       NOT NULL,
    typicality2  DECIMAL       NOT NULL,
    description  VARCHAR (200) NOT NULL,
    taster       VARCHAR (20)  NOT NULL,
    date         VARCHAR (10)  NOT NULL,
    harmony      DECIMAL       NOT NULL,
    outcome      VARCHAR (20),
    сipher       VARCHAR (6)   NOT NULL
);


Пример как будет выглядеть в живую. Триггер должен вписать это в 'Итог' aka 'outcome':

61b6f2f3bb7dd392312322.png

Простая генерация не подойдет
  • Вопрос задан
  • 391 просмотр
Решения вопроса 1
phoinixrw
@phoinixrw
Архитектор информационных систем
В комментарии автора ошибка.
Для переопределения значения поля не требуется выполнять отдельное обновление, достаточно его пределить ДО вставки:

CREATE TRIGGER maintable_pricetable_sum_trigger_insert
         BEFORE INSERT
            ON maintable_pricetable
      FOR EACH ROW
BEGIN
    SET NEW.outcome = (NEW.transparency + NEW.color + NEW.pis + NEW.purity + NEW.intensity + NEW.typicality + NEW.purity2 + NEW.intensity2 + NEW.persistence + NEW.typicality2 + NEW.harmony);
END;


При этом, не совсем очевидно, почему сумма не считается во время UPDATE? Для этого требуется создать такой же триггер на UPDATE:

CREATE TRIGGER maintable_pricetable_sum_trigger_update
         BEFORE UPDATE
            ON maintable_pricetable
      FOR EACH ROW
BEGIN
    SET NEW.outcome = (NEW.transparency + NEW.color + NEW.pis + NEW.purity + NEW.intensity + NEW.typicality + NEW.purity2 + NEW.intensity2 + NEW.persistence + NEW.typicality2 + NEW.harmony);
END;


И кстати, когда бы автор дошел до момента обновления суммы во время UPDATE, то он бы начал веселую борьбу с рекурсией.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@esskimos Автор вопроса
CREATE TRIGGER maintable_pricetable_sum_tr
         AFTER INSERT
            ON maintable_pricetable
      FOR EACH ROW
BEGIN
    UPDATE maintable_pricetable
       SET outcome = (NEW.transparency + NEW.color + NEW.pis + NEW.purity + NEW.intensity + NEW.typicality + NEW.purity2 + NEW.intensity2 + NEW.persistence + NEW.typicality2 + NEW.harmony) 
     WHERE id = NEW.id;
END;


Проще чем я думал...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы