#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