SQLite "modified" 触发器,仅在值实际更改时才更新修改的字段

SQLite "modified" trigger which only only updates modified field if values have actually changed

我正在为 SQLite 开发一个触发器,当且仅当所考虑的所有列中的数据实际发生更改时,它才会更新“已修改”字段。

我已经非常接近:

CREATE TRIGGER "main"."Orders_modified"
BEFORE UPDATE OF "order_date", "grand_total_in_dollars", "ship_to", "store", "more_href", "order_id", "grand_total" ON "Orders"
BEGIN
  UPDATE Orders 
  SET modified=(STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW', 'localtime')) 
  WHERE (OLD.order_id=NEW.order_id) 
    AND (
          (OLD.order_date != NEW.order_date) OR 
          (OLD.grand_total_in_dollars != NEW.grand_total_in_dollars) OR
          (OLD.ship_to != NEW.ship_to) OR 
          (OLD.store != NEW.store) OR 
          (OLD.more_href != NEW.more_href) OR 
          (OLD.grand_total != NEW.grand_total)
    );
END;

问题是,当第一次将值放入任何这些字段时,它不起作用;即,当旧值为 'Null' 时。否则效果很好。

我的临时解决方法是将所有受监视的字段默认为空字符串,但我想了解为什么(如果)这是必要的。

关于为什么会这样的任何提示,以及任何可能可用的解决方法?

非常感谢。

使用运算符 IS NOT 而不是运算符 !=,它在一个或两个操作数是 NULL:

时有效
......................................................
WHERE (OLD.order_id=NEW.order_id) 
  AND (
       (OLD.order_date IS NOT NEW.order_date) OR 
       (OLD.grand_total_in_dollars IS NOT NEW.grand_total_in_dollars) OR 
       (OLD.ship_to IS NOT NEW.ship_to) OR 
       (OLD.store IS NOT NEW.store) OR 
       (OLD.more_href IS NOT NEW.more_href) OR
       (OLD.grand_total IS NOT NEW.grand_total)
      );