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)
);
我正在为 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)
);