Триггер SQL для обновления записи вместо вставки, если значения не изменились - PullRequest
0 голосов
/ 04 февраля 2019

Я пытаюсь реализовать триггер SQL, который будет ОБНОВЛЯТЬ вместо ВСТАВКИ, если значение одного столбца изменилось.

Пример таблицы

Id | Name | Income | Date
11   John   10000    2019-02-01
11   John   15000    2019-02-02

Эта таблица не имеет первичнойКлюч, потому что он будет иметь несколько записей для одного и того же идентификатора, каждая с разной датой.Чего я хочу добиться, чтобы сэкономить место, так это ОБНОВИТЬ вместо ВСТАВКИ, если изменилось затухание дохода ... например, если следующая запись будет:

11  John  15000  2019-02-03

Я хочу, чтобы триггер ОБНОВИЛДАТА вместо создания новой Записи в Таблице.Таким образом, это будет выглядеть следующим образом:

11   John   10000    2019-02-01
11   John   15000    2019-02-03  <-- Changed!

Данные поступают из почасовой таблицы, в которой записываются доходы за день ... и в конце дня делает огромную вставку всех записей за частаблица для таблицы доходов, чтобы сохранить историю.

Я попробовал следующий триггер, но он не работал, так как он блокирует.

DELIMITER //
CREATE TRIGGER before_insert_income
    BEFORE INSERT ON income_30
    FOR EACH ROW
BEGIN
    IF NEW.income = (select income from income_30 where ID=NEW.ID and date=(select max(date) from income_30)) THEN
        UPDATE income_30 set date = NEW.date where ID=NEW.ID;
END IF;
END; //
DELIMITER ;

Я также думаю о выполнении ОБНОВЛЕНИЕ вместоВСТАВЬТЕ и выполните триггер, который сделает противоположное, вставит новую запись, если доход изменился, но я не знал, какой столбец я могу сделать первичным для обновления.

Прошу прощения, если это глуповопрос, но это беспокоит меня некоторое время.

Большое спасибо!

1 Ответ

0 голосов
/ 04 февраля 2019

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

DELIMITER //
CREATE TRIGGER before_insert_income
    BEFORE INSERT ON income_30
    FOR EACH ROW
BEGIN
    IF NEW.income = (select income from income_30 where ID=NEW.ID and date=(select max(date) from income_30)) THEN
       DELETE FROM income_30 where id=NEW.id and date=(select max(date) from income_30);

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