【问题标题】:MySQL update TRIGGER on the same tableMySQL 在同一张表上更新 TRIGGER
【发布时间】:2015-12-30 09:23:31
【问题描述】:

我在更新同一个表的另一列后尝试更新表的字段时遇到了一些问题。 我知道我不能在我正在更新的同一张表上执行触发器,但我需要找到一个技巧来做到这一点。

比如我的表是:

ParentName | Age | Update_date

John         12    2014-12-01
Eric         23    2014-4-01
Jack         32    2014-5-01
Jill         33    2014-2-01

更新age 后,我需要更新update_date,我的真实情况是我无法直接从更新查询中执行此操作,因为我希望此规则能够正常工作,而不取决于我如何更新表格。

我正在尝试使用存储过程来做到这一点,但我不太了解它们。

有人有任何想法或可以向我解释如何使用经过处理的程序来做到这一点?

【问题讨论】:

  • 您可以在更新触发器之前使用,如果旧日期不等于新日期,则将Update_date设置为curdate()
  • 使用 before_update 触发器它给了我这个错误:Can't update table 'parent_table' in stored function/trigger 因为它已被调用此存储函数/触发器的语句使用
  • 你可以改变表的结构。将 CURRENT_DATE ON UPDATE 设置为默认值。每当您的行更新时,其值将按当前日期更改。这样就不需要触发器也不需要更新查询
  • 不,我不能,因为我可以将一个人的 ParentName 从 John 更改为 David,但在这种情况下,我不想更改 update_date
  • 是的,你是对的。这不仅适用于年龄......

标签: mysql stored-procedures triggers sql-update


【解决方案1】:

您的触发器可能是这样的:

DELIMITER //

CREATE TRIGGER persons_updt BEFORE UPDATE ON persons
FOR EACH ROW
  IF (NEW.age <=> OLD.age) THEN SET NEW.Update_date=current_date();
END IF//

DELIMITER ;

我在这里使用null-safe operator <=>。请看小提琴here

【讨论】: