【问题标题】:MySQL Trigger update a 'modifiedDate' column not working properlyMySQL 触发器更新“modifiedDate”列无法正常工作
【发布时间】:2020-09-28 08:45:28
【问题描述】:

我有一个特殊要求,我需要将“modifiedDate”列的日期时间值自动更新为 NOW(),如果:

  1. 提供的值为空
  2. 提供的值与更新前相同

但是

如果提供的值是任何其他日期字符串,则使用值更新列。

所以,我已经设置了这个触发器,但现在有些事情是正确的:

CREATE TRIGGER `tr_users_updateModDateOnUpdate` BEFORE UPDATE ON `tbl_users`
 FOR EACH ROW IF (OLD.date_modified <> NEW.date_modified) THEN
  SET NEW.date_modified = IFNULL(NEW.date_modified, NOW());
ELSE
  SET NEW.date_modified = NOW();
END IF

我看不出它有什么问题...,但是在使用我的 Web 应用程序进行测试时,我遇到了奇怪的行为。所以尝试查看问题是我的触发器还是我的 php 代码...

谁能告诉我我的触发器代码是否符合我的上述要求?谢谢一百万!

拍拍

【问题讨论】:

  • 但我在使用我的 Web 应用程序进行测试时出现了奇怪的行为 描述这种奇怪... PS。当执行 'THEN' 时,NEW.date_modified 不能为 NULL - 所以 IFNULL(此外,重新分配本身)是多余的。
  • 附言。您应该考虑 5 种不同的情况 - 对于 OLD 和 NEW,值可能为 NULL 或不为空,如果两者都不为空,则可能相等或不相等。

标签: mysql sql date database-trigger


【解决方案1】:

您的触发器包含IF 语句,因此它需要BEGIN/END 块。此外,条件似乎并不符合您的要求。最后需要设置DELIMITER

我认为这可以满足您的要求:

delimiter //

create trigger tr_users_update_mod_date_on_update 
before update on tbl_users
for each row 
begin
    if new.date_modified is null or old.date_modified = new.date_modified then
        set new.date_modified = now();
    end if;
end;
//

delimiter ;

【讨论】:

  • 太棒了。感谢您的回复,我已经采用了您提出的解决方案,并且似乎可以完成这项工作。我认为我以前的方式最后还可以(我这边是 php 编码问题),但你的方式更干净。我正在使用 phpMyAdmin 来管理我的 MySQL 数据库,并且刚刚复制粘贴了 phpMyAdmin 给我的触发器。因此它可能错过了您提到的分隔符的原因。猜测它会在后台正确设置它,因为它现在工作得很好。非常感谢!
猜你喜欢
  • 2015-12-02
  • 1970-01-01
  • 1970-01-01
  • 2012-02-25
  • 2012-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多