2016-01-28 2 views

ответ

2

Нет трюков. Если вы хотите обнаружить, что значение столбца изменилось, вам необходимо явно сравнить значения 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 

Это может быть очень полезно, если у вас есть много столбцов.

Помимо этого, на самом деле нет никаких других «трюков».

+0

Спасибо большое ..! –