Внутри триггера уровня строки в MySQL невозможно напрямую определить, на какие столбцы ссылаются в выражении. MySQL не дает нам доступа к оператору, который вызывает срабатывание триггера.
В триггере UPDATE
мы можем получить доступ к значениям столбцов «NEW» и «OLD», и мы можем сделатьсравнение.
Учитывая оператор, такой как это:
UPDATE myTable SET fo = IFNULL(fo,0) + 1 WHERE id = 42 ;
Значение id
не будет изменено, но если существует соответствующая строка (или строки), значение fo
столбец в этих строках обязательно будет изменен.
Чтобы обнаружить это в триггере, нам нужно сравнить OLD.fo
с NEW.fo
. Мы также должны учитывать изменение с NULL на ненулевое или наоборот.
Чтобы обнаружить изменения в любом количестве столбцов, нам нужно проверить каждый столбец.
IF ( OLD.id <=> NEW.id )
AND ( OLD.fee <=> NEW.fee )
AND ( OLD.fi <=> NEW.fi )
AND ( OLD.fo <=> NEW.fo )
AND ( OLD.fum <=> NEW.fum ) THEN
-- the values of these columns (id, fee, fi, fo, fum) is not changed
ELSE
-- the value of at least one of the columns id, fee, fi, fo, or fum is changed
END IF
Оператор нулевого безопасного сравнения <=>
(космический корабль) - сокращение от MySQL
a <=> b
эквивалентно:
( ( a IS NOT NULL AND b IS NOT NULL AND a = b ) OR ( a IS NULL AND b IS NULL ) )
Нормативный шаблон для id
столбец, чтобы быть суррогатным первичным ключом, с большинством или всеми желаемыми свойствами: ненулевой, простой тип данных, уникальный, анонимный, неизменяемый, ...
Это был бы очень странный вариант использованияизменить суррогатное id
значение первичного ключа строки.