У меня был триггер «После обновления» в моей таблице, но мне нужно знать, как столбец изменений. Я не хочу это сделать:MySQL - Trigger UPDATE (Как меняются значения)
IF OLD.*column* <> NEW.*column* THEN ...
Кто есть трюк?
У меня был триггер «После обновления» в моей таблице, но мне нужно знать, как столбец изменений. Я не хочу это сделать:MySQL - Trigger UPDATE (Как меняются значения)
IF OLD.*column* <> NEW.*column* THEN ...
Кто есть трюк?
Нет трюков. Если вы хотите обнаружить, что значение столбца изменилось, вам необходимо явно сравнить значения OLD.col
и NEW.col
.
Один из них с SQL - это трехзначная логическая логика. И тест неравенства на значение NULL никогда не вернет TRUE. (Выражение оценивается в логическом контексте может возвращать одно из трех значений:. TRUE
, FALSE
или NULL
foo <> NULL --> NULL
NULL <> NULL --> NULL
foo <> bar --> TRUE
Если вы хотите, чтобы обнаружить, было ли изменено значение столбца, в том числе изменения в или из NULL значение, тест неравенства не будет резать.
Один трюка заключается в использовании нулевого безопасного оператора сравнения (символ космического корабля <=>
), который будет возвращать только значение TRUE или FALSE, даже если один или оба значения сравниваются NULL, чтобы обнаружить разницу:
IF NOT (NEW.col <=> OLD.col) THEN
-- value of col was modified
END IF;
Еще одна хитрости заключается в использовании SQL заявления, чтобы помочь сформировать часть кода вам нужно будет в теле триггера. Ссылка на таблицу columns
в базе данных information_schema
. Это короткий пример, но это можно было бы расширить, включив в него дополнительные инструкции, и END IF
. Возврат из этого может быть вставлен в текстовый редактор, чтобы помочь вам создать тело триггера.
SELECT CONCAT(' IF NOT (NEW.`',c.column_name,'` <=> OLD.`',c.column_name,'`) THEN') AS i
FROM information_schema.columns c
WHERE c.table_name = 'mytable'
AND c.table_schema = 'mydatabase'
ORDER BY c.ordinal_position
возвращает что-то вроде
--------------------------------------------------------------
IF NOT (NEW.`id` <=> OLD.`id`) THEN
IF NOT (NEW.`created` <=> OLD.`created`) THEN
IF NOT (NEW.`display_name` <=> OLD.`display_name`) THEN
Это может быть очень полезно, если у вас есть много столбцов.
Помимо этого, на самом деле нет никаких других «трюков».
Спасибо большое ..! –
Это единственный трюк * Я * знаю ... –