【问题标题】:SQLite "modified" trigger which only only updates modified field if values have actually changedSQLite“修改”触发器,仅在值实际更改时才更新修改的字段
【发布时间】:2021-03-12 01:59:09
【问题描述】:

我正在开发一个 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;

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

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

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

非常感谢。

【问题讨论】:

    标签: sqlite triggers null timestamp last-modified


    【解决方案1】:

    而不是运算符!= 使用运算符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)
          );
    

    【讨论】:

    • 太棒了,谢谢!我有一个奖金回合给你,我想我必须作为一个单独的问题来做。
    • 感谢您指导我。当然,我后来发现它只对我在 Navicat 中手动编辑值有效。当我使用 Python / SQLAlchemy 以编程方式更改任何值时,我又回到了每次都更新每一行。但这是我的(单独的)问题!
    猜你喜欢
    • 2012-08-21
    • 2019-07-06
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多