sbh
@sbh

Как обновлять записи в триггере BEFORE INSERT?

Есть таблица:
ID
LOGIN_ID
Start
End
Session_ID


поле Session_ID имеет индекс "Уникальное"
есть скрипт который парсит данные и льет их в таблицу.
Необходимо при нахождении в таблице записи с Session_ID обновлять поле End если новое значение больше чем предыдущее.
Реализовал с помощью триггера Before insert, но получаю ошибку:
""Can't update table 'data' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.""

Возможно как-то по-другому можно такое поведение реализовать, вопрос как?

Триггер:
CREATE TRIGGER `CHECK_SESSION` BEFORE INSERT ON `data`
 FOR EACH ROW BEGIN
SET @myVar1 = (SELECT `START` from `data` where `SESSION_ID` = NEW.SESSION_ID and `END` < new.END);
IF(@myVar1 IS NOT NULL) THEN 
BEGIN
	Insert into `data`(`LOGIN_ID`, `IP`, `SESSION_ID`, `SESSION_START`, `SESSION_TIMESTAMP`) values (new.LOGIN_ID, new.IP, new.SESSION_ID, new.SESSION_START, new.SESSION_TIMESTAMP) ON DUPLICATE KEY UPDATE `SESSION_TIMESTAMP` = new.SESSION_TIMESTAMP;
END;
END IF;
SET @myVar2 = (SELECT `START` from `data` where `SESSION_ID` = NEW.SESSION_ID and `END` > new.END);
IF(@myVar2 IS NOT NULL) THEN 
BEGIN
	declare msg varchar(128);
	set msg = 'Filter!';
    signal sqlstate '45000' set message_text = msg;
END;
END IF;
END
  • Вопрос задан
  • 29 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
INSERT
  INTO `table` (`LOGIN_ID`, `Start`, `End`, `Session_ID`)
  VALUES (:loginId, :start, :end, :sessionId)
  ON DUPLICATE KEY UPDATE `End` = GREATEST(`End`, :end)

А в триггерах нельзя изменять таблицу, по которой сработал триггер. Иначе было бы бесконечное циклическое срабатывание триггера.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы