Как проверить, что НОВОЕ значение существует в ПЕРЕД ОБНОВЛЕНИЕМ Триггер Mysql - PullRequest
0 голосов
/ 24 марта 2020

У меня есть таблица Demo:

create table Demo (
   id int(10) auto_increment primary key,
   text varchar(30) default null,
   istrue boolean default false
);

Я хочу создать триггер обновления так, чтобы:

Когда Update Demo set istrue = false where id = 1; (не «set text =») -> normal update.

Когда Update Demo set text= 'abc' where id = 1; ("set text =") -> SET NEW.text := concat(OLD.text,'#', NEW.text);

Я реализовал триггер следующим образом:

DELIMITER $$
CREATE TRIGGER update_text 
    BEFORE update ON Demo
    FOR EACH ROW 
BEGIN
    IF (exists(SELECT NEW.text)) THEN -- how to check NEW.text exists???
        SET NEW.text := concat(OLD.text,'#', NEW.text);
    END IF;
END$$
DELIMITER ;

Но он не работает! Пожалуйста помоги. Благодарю вас!!! (Мой Engli sh не очень хороший. Надеюсь, что все сочувствовали)

1 Ответ

0 голосов
/ 24 марта 2020
CREATE TRIGGER update_text 
BEFORE update 
ON Demo
FOR EACH ROW 
SET NEW.text = CASE WHEN OLD.text <=> NEW.text
                    THEN NEW.text
                    ELSE CONCAT(OLD.text, '#', NEW.text)
                    END;

PS. Триггер с одним оператором - повторный анализ BEGIN-END и DELIMITER не требуется.


После глубокого изучения я нашел способ обнаружить, что значение поля было установлено в операторе UPDATE.

Однако я не могу гарантировать его надежность. Я только проверяю, присутствует ли подстрока '`text`' в текущем тексте запроса - но во многих случаях эта проверка даст ошибочный результат, например, неверное ИСТИНА, если эта подстрока является частью нового значения, или неправильное ЛОЖЬ, если имя поля не заключено в обратные кавычки. Так что знайте.

CREATE TRIGGER update_text 
BEFORE update 
ON demo
FOR EACH ROW 
SET NEW.`text` = CASE WHEN LOCATE('`text`', ( SELECT info 
                                              FROM information_schema.processlist 
                                              WHERE id = CONNECTION_ID() 
                                            )
                                 )
                    THEN CONCAT(OLD.`text`, '#', NEW.`text`)
                    ELSE NEW.`text`
                    END;

скрипка

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