代码之家  ›  专栏  ›  技术社区  ›  bbutle01

第一个mysql触发器失败

  •  0
  • bbutle01  · 技术社区  · 16 年前

    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 ;
    

    我有两个问题:

    2 回复  |  直到 14 年前
        1
  •  1
  •   shylent    16 年前

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

    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
    
        2
  •  0
  •   Johan    14 年前

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

    只能更改 BEFORE 触发者 SET new.field = newvalue .
    这只会影响触发了触发器的“当前”行(可以说)。