MySQL trigger and values not supplied in update query
The Boolean expression

NEW.col2 &lt;=&gt; OLD.col2


can be used in an IF statement (or elsewhere).  Notes:


It tests for whether col2 is changing, it does not test whether you specified col2 without changing it.
NULL is properly handled because of the &lt;=&gt; operator.


UPDATE (based on further details)  See if this comes closer:

IF ( NEW.col1 &lt;=&gt; OLD.col1  -- testing only col1 for changes
 AND NEW.col2 IS NULL)      -- avoiding clobbering col2
    NEW.col2 = 'triggered';


(You haven't yet specified enough use cases to provide a complete solution, but maybe I have given you enough building blocks?)