MySQL BEFORE UPDATE触发器NEW/OLD值变更判断(含NULL、空字符串)
BEFORE UPDATE 触发器字段变更判断解决方案
你原有写法IF NEW.column_1 <> OLD.column_1 THEN ...的核心问题是:只要新旧值任意一个为NULL,普通比较运算符的返回结果就为NULL而非TRUE,对应逻辑分支无法触发。
你提到的<=>是MySQL的安全相等运算符,它本身不止能处理NULL的等值判断,也可以正常识别空字符串的等值比较,不需要额外单独针对空字符串做特殊处理,根据你的业务规则可以选择以下两种方案:
方案1:NULL和空字符串视为不同值,二者互转算变更
直接对安全等于的结果取反即可,覆盖所有变更场景:
IF NOT (NEW.column_1 <=> OLD.column_1) THEN -- 字段发生变更时的执行逻辑 END IF;
覆盖场景说明:
- 旧值为NULL,新值为任意非NULL值(含空字符串):触发
- 旧值为空字符串,新值为任意非空字符串/NULL:触发
- 旧值为非空普通字符串,新值与旧值内容不同/为空/为NULL:触发
- 新旧值同为NULL/同为空字符串/同为相同普通字符串:不触发
方案2:NULL和空字符串视为等价,二者互转不算变更
如果业务逻辑中认为NULL和空字符串没有差异,只有和实际非空内容不同才算变更,可通过COALESCE函数把NULL统一转换为空字符串后再比较:
IF NOT ( COALESCE(NEW.column_1, '') <=> COALESCE(OLD.column_1, '') ) THEN -- 字段发生变更时的执行逻辑 END IF;
内容的提问来源于stack exchange,提问作者user17168498
相关产品推荐
相关产品推荐

