В триггерах MySQL есть способ узнать, какой столбец получает обновление? - PullRequest
0 голосов
/ 10 октября 2019

Есть ли в mysql утверждение, которое помогает мне узнать, какой столбец изменяется в триггере?

Я уже пробовал этот способ:

DELIMITER //
CREATE TRIGGER trigger
    AFTER UPDATE ON myTable
    FOR EACH ROW
        IF OLD.ID != NEW.ID THEN
            INSERT INTO backupTable
                (ID,back_ID) values (NEW.ID,OLD.ID);
        END IF
//
DELIMITER;

Но мой учитель сказал, что это другоегораздо эффективнее, чем сравнить OLD.ID с NEW.ID

1 Ответ

0 голосов
/ 11 октября 2019

Внутри триггера уровня строки в 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 значение первичного ключа строки.


...