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
  • Вопрос задан
  • 24 просмотра
Решения вопроса 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)

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

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

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