MySQL Триггерный вопрос: запускается только при изменении столбца?

18

Я не знаю, возможно ли это, но у меня есть столбец с именем active в таблице. Всякий раз, когда изменяется активный столбец, я хотел бы сбросить дату в столбце date , но ТОЛЬКО , если изменяется столбец active .

Если другие столбцы изменены, но не столбец active , то дата останется прежней.

    
задан kylex 04.11.2010 в 15:57
источник
  • перед обновлением необходимо проверить старое значение на новое значение активного столбца, см. пример в java2s.com/Code/Oracle/Trigger/... –  Haim Evgi 04.11.2010 в 16:06
  • stackoverflow.com/questions/6296313/... –  zloctb 20.11.2014 в 12:07

2 ответа

29

что-то вроде

DELIMITER //
 CREATE TRIGGER updtrigger BEFORE UPDATE ON mytable
     FOR EACH ROW
     BEGIN
     IF NEW.active <> OLD.active THEN
     SET NEW.date = '';     
     END IF;
     END
     //
    
ответ дан Haim Evgi 04.11.2010 в 16:13
  • Если я хочу обновить дату до текущей даты, строка изменится на SET NEW.date = CURDATE (); ? –  kylex 04.11.2010 в 16:56
  • , если вам нужна дата да, если вы хотите использовать дату + время СЕЙЧАС () –  Haim Evgi 05.11.2010 в 12:49
  • Если бы вы установили active = 1, в то время как активный был уже 1 в БД, разве это не было бы изменением? Я предполагаю, что это было бы технически, потому что вы установили столбец и терминологию базы данных, это изменение столбца. Но NEW.active не OLD.active дает вам только если NEW и OLD имеют разные значения! Что вы будете делать в этом случае? @HaimEvgi –  edam 12.08.2015 в 06:50
  • Не лучше ли использовать <=> вместо <>? –  stack 07.09.2016 в 06:40
  • @stack да, хотя не буквально, <=> означает «равно, где null обрабатывается как значение, которое можно сравнить», поэтому вам нужно будет изменить не NEW.active <=> OLD.active –  Brian Leishman 06.02.2018 в 22:45
13

Включить проблему с тестом IF в примере # 2. Когда одно из значений равно нулю, & lt; & gt; test возвращает null. Это приводит к тому, что тест не выполняется, и действие триггера не будет запущено, даже если одно значение не равно нулю. Чтобы исправить это, я придумал этот тест, который использует & lt; = & gt; (Равно NULL-безопасно). Надеюсь, это поможет кому-то.

DELIMITER $$
DROP TRIGGER IF EXISTS updtrigger ;
$$
CREATE TRIGGER updtrigger  AFTER UPDATE
    ON yourTable FOR EACH ROW
BEGIN
    IF ((NEW.active <=> OLD.active) = 0)  THEN
     SET NEW.date = '';     
     END IF;
$$
    
ответ дан John Glassman 12.02.2013 в 03:52
  • Вы можете просто использовать оператор NOT вместо сравнения с нулем, как в следующем ответе: stackoverflow.com/a/24041832/1419007. В противном случае, хороший ответ. –  user2428118 06.06.2014 в 10:19