ОБНОВЛЕНИЕ MySQL ПЕРЕД триггерной головоломкой

#mysql #triggers

#mysql #триггеры

Вопрос:

У меня есть таблица со столбцом IsDirty, который я хочу, чтобы он был равен «1» при обновлении строки, но я также хочу иметь возможность явно возвращать флагу IsDirty значение «0». Итак, я создал триггер:

 FOR EACH ROW
BEGIN

 IF NEW.IsDirty = 0 AND OLD.IsDirty=1 THEN
  SET NEW.IsDirty = 0;
 ELSE SET NEW.IsDirty = 1;
 END IF; 

END;
  

С помощью этого триггера обновление любого столбца устанавливает столбец IsDirty равным 1. И я также могу «ОБНОВИТЬ имя_таблицы, УСТАНОВИТЬ IsDirty = 0, ГДЕ xxx = 123» — отлично работает, чтобы отключить IsDirty.

Но если я сделаю это дважды подряд («UPDATE table_name SET IsDirty = 0, ГДЕ xxx= 123»), он снова установит значение IsDirty равным 1. Сделайте это снова, установите его в 0. И обратно, переключая его каждый раз. Глядя на мой триггер, я вижу, как это произойдет. Итак, я изменил его на это:

 FOR EACH ROW
BEGIN

IF NEW.IsDirty = 0 AND OLD.IsDirty=1 THEN
 SET NEW.IsDirty = 0;
ELSEIF NEW.IsDirty = 0 AND OLD.IsDirty=0 THEN
 SET NEW.IsDirty = 0;
ELSE SET NEW.IsDirty = 1;
END IF; 
  

Но теперь обновление любого столбца, отличного от IsDirty, больше не устанавливает значение IsDirty равным 1. Единственный способ установить его равным 1 сейчас — явно обновить столбец IsDirty.

Что я делаю не так? Я просто хочу, чтобы IsDirty включался при обновлении столбца, а также мог отключать его, даже два раза подряд, и чтобы он оставался выключенным.

Спасибо за вашу помощь!

Ответ №1:

Ну, в итоге я сделал этот триггер немного по-другому. Вместо того, чтобы запутываться в попытках определить, является ли обновление просто изменением данных в строке или изменением только флага IsDirty, или обоих, или ни одного…

В итоге я изменил требование на: «если вы хотите сбросить флаг IsDirty; т. Е.. установите его равным нулю — затем установите его равным -1 в инструкции update «. Итак, это очень четко и ясно.

Итак, теперь триггер выглядит так:

 BEGIN
  SET NEW.EffectiveDate = current_timestamp;
  IF NEW.IsDirty = -1 THEN
    BEGIN
      SET NEW.IsDirty = 0;
    END;
  ELSE
    SET NEW.IsDirty = 1;
  END IF;
END    
  

И оператор ОБНОВЛЕНИЯ, который хочет сбросить столбец IsDirty, выглядит следующим образом:

 UPDATE task_set SET IsDirty = -1 WHERE CategoryID = 20