在同一个表上更新后的MySQL触发器

在同一个表上更新后的MySQL触发器

问题描述:

我有一个使用BEFORE INSERT ON table的MySQL触发器,它可以计算一个值并在用户在特定列中插入值后更新同一个表。这按预期工作。但是用户在输入时出错并修复了错误,我想编写一个触发器,在修复错误后更新计算的值。有没有办法做到这一点?在同一个表上更新后的MySQL触发器

+0

TRIGGER AFTER UPDATE? – 2013-03-14 16:16:13

+0

添加BEFORE或AFTER UPDATE触发器。 – Tom 2013-03-14 16:17:37

A BEFORE UPDATE ON table触发器可以访问行中现有的值以及新提供的值,并且可以根据所需的任何条件和表达式来设置表中任何列的值。

例如,可以测试一个或多个关注列的值是否已被修改,然后将其他列设置为某个表达式。

CREATE TRIGGER my_before_update_trigger 
BEFORE UPDATE ON my_table 
FOR EACH ROW 
BEGIN 
    IF NOT ((NEW.col1 <=> OLD.col1) AND (NEW.col2 <=> OLD.col2)) THEN 
     SET NEW.col3 = NEW.col1 * NEW.col2 ; 
    END IF; 
END$$ 
+0

谢谢你,下面你的例子,我做错了什么?它抱怨语法错误! 'CREATE TRIGGER my_before_update_trigger BEFORE UPDATE ON TmapSlideData FOR EACH ROW BEGIN IF NOT((NEW.MappedReads OLD.MappedReads)AND(NEW.FOV OLD.FOV)) SET NEW.MappedReadsPerFOV = NEW.MappedReads/NEW.FOV; END IF; END $$' – UNagaswamy 2013-03-14 16:55:53

+0

我的例子是缺少'THEN'关键字。而'$$'是一个样本分隔符,您需要一个匹配的(前面的)'DELIMITER $$'语句。而且您可能需要考虑触发器命名约定,该约定包含触发器名称中表的名称。 (这不是MySQL的要求,但它可以在大型模式中使用,包含大量表格和大量触发器。)另一个需要考虑的事情是,是否确实需要存储派生列。该值可以通过在查询的SELECT列表中包含相关表达式来返回。 – spencer7593 2013-03-14 17:50:57

+0

非常感谢,工作! – UNagaswamy 2013-03-14 19:49:05