2014-10-22 72 views
0
DELIMITER // 

CREATE TRIGGER `Salary` AFTER UPDATE ON `employee` 
    FOR EACH ROW BEGIN 

IF OLD.time_out <> NEW.time_out THEN 
UPDATE employee SET time_work=TIMEDIFF(time_out,time_in); 
END IF; 

    END; 


DELIMITER ; 

我用这个查询触发MySQL错误1442

UPDATE DataBaseemployee SET time_out =“2014年10 16点41分09秒” WHERE IDREC =“4945”

THERE错误代码:1442 无法更新在存储函数/触发器表“雇员”,因为它已经被使用通过调用这个存储的函数/触发器的语句。

+0

yes您无法在执行触发器的同一张表上执行插入/删除/更新操作。最好你可以设置值为'set new.time_work = TIMEDIFF(time_out,time_in);' – 2014-10-22 07:13:01

+1

FWIW,你不能在AFTER触发器中改变'NEW.time_work'。 – 2014-10-22 07:15:36

+0

@BillKarwin你是正确的更新后触发器,所以设置不会在这里工作,它需要在更新之前。 – 2014-10-22 07:16:55

回答

0

不能更新,其中触发器调用的表(employee):

在存储函数或触发器,它不允许修改已被使用(读或写一个 表)通过调用该函数或触发器的 语句。

这样做会产生错误1442

Error Code: 1442 
Can't update table 'employee' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. 

解决方案:代替AFTER UPDATE ON,使之成为BEFORE UPDATE ON触发,设置新的价值领域,在插入前 - 如果time_work是新条目中的字段,则需要在插入前更新 - 可能的SQL'd是(未测试):

DELIMITER // 
CREATE TRIGGER `Salary` BEFORE UPDATE ON `employee` 
    FOR EACH ROW BEGIN 
     IF OLD.time_out <> NEW.time_out THEN 
      SET NEW.time_work=TIMEDIFF(time_out,time_in); 
     END IF; 
    END; 
DELIMITER ;