第一个mysql触发失败

时间:2009-05-04 17:32:46

标签: mysql triggers

好的,我已经开始在mysql中编写我的第一个触发器了,它没有出错,但它也不起作用......

DELIMITER $$

DROP TRIGGER `cc`.`update_expires_date_trig`$$
CREATE TRIGGER `update_expires_date_trig` BEFORE INSERT ON `credit_test_acc` 
 FOR EACH ROW BEGIN
    UPDATE credit_test_acc SET date_expires_acc = DATE_ADD(CURDATE(), INTERVAL 6 MONTH) WHERE type_acc = 'init'
END;
$$
DELIMITER ;

我有两个问题:

  1. 无法在存储的函数/触发器中更新表'credit_test_acc',因为它已被调用此存储函数/触发器的语句使用。

  2. 定义的触发器是否会更新JUST插入的行或数据库中的每一行?

2 个答案:

答案 0 :(得分:1)

据我所知,它必须像这样重写才能按预期工作:

DELIMITER $$

DROP TRIGGER `cc`.`update_expires_date_trig`$$
CREATE TRIGGER `update_expires_date_trig` BEFORE INSERT ON `credit_test_acc` 
FOR EACH ROW BEGIN
   SET NEW.date_expires_acc = DATE_ADD(CURDATE(), INTERVAL 6 MONTH)
END;
$$
DELIMITER ;

其中NEW表示即将插入表中的行。你没有解释'type_acc'在这里扮演什么角色(我可以想到不止一种方式可以解释),所以我把它留了出来。如果它是我认为的那样,你可以像这样应用它:

IF NEW.type_acc = 'init' THEN # do whatever you want here

答案 1 :(得分:0)

触发器无法更改触发它的表格 直接或间接。

您只能通过BEFORE更改SET new.field = newvalue触发器中的值 这只能影响触发触发器的“当前”行(可以这么说)。