SQLite“;修改的;触发器,仅在值实际更改时更新修改的字段

SQLite“;修改的;触发器,仅在值实际更改时更新修改的字段,sqlite,triggers,null,timestamp,last-modified,Sqlite,Triggers,Null,Timestamp,Last Modified,我正在为SQLite开发一个触发器,它将更新“modified”字段,如果&仅当所考虑的所有列中的数据实际发生了更改 我已经非常接近: CREATE TRIGGER "main"."Orders_modified" BEFORE UPDATE OF "order_date", "grand_total_in_dollars", "ship_to", "store", "

我正在为SQLite开发一个触发器,它将更新“modified”字段,如果&仅当所考虑的所有列中的数据实际发生了更改

我已经非常接近:

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;
问题是,当一个值第一次被放入这些字段中时,它不起作用;i、 例如,当旧值为“Null”时。否则效果很好

我的临时解决方法是将所有监控字段默认为空字符串,但我想了解为什么需要这样做(&if)

关于为什么会出现这种情况的任何提示,以及可能提供的任何解决方法


非常感谢。

而不是操作员
=使用当一个或两个操作数均为空时有效的运算符:

......................................................
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)
      );

太棒了,谢谢你!我有一轮奖金给你,我想我必须作为一个单独的问题来回答。谢谢你带我走过这一轮。当然,我后来发现它只适用于在Navicat中手动编辑值的情况。当我使用Python/SQLAlchemy以编程方式更改任何值时,我又回到了每次更新每一行的状态。但那是我(单独)的问题!