第一个mysql触发器失败

第一个mysql触发器失败,mysql,triggers,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 =

好的,我已经开始在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 ;
我有两个问题:

  • 无法更新存储函数/触发器中的表“credit\u test\u acc”,因为调用此存储函数/触发器的语句已使用该表

  • 定义的触发器是只更新刚刚插入的行,还是更新数据库中的每一行


  • 据我所知,它必须像这样重写才能像你期望的那样工作:

    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
    

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

    您只能通过
    SET new.field=newvalue

    这只会影响触发的“当前”行(可以这么说)