帮助MySql触发器或替代

时间:2011-09-25 18:26:08

标签: php mysql triggers

我正在尝试将两个单独的设计集中在一起,因此我理解整体方法可能并不理想。基本上通过PHP table1中的用户输入和table2的一部分填充,然后我需要自动填充table2和table3的其余部分。

我有以下数据库

enter image description here

使用此触发器

DELIMITER |

CREATE TRIGGER new_trigger AFTER INSERT on table2
FOR EACH ROW BEGIN
    INSERT INTO table3(att1, DateCreated, DateUpdated)
    VALUES('PG', now(), now());
    UPDATE table2 SET table3Id = table3.LAST_INSERT_ID();
END;
|

DELIMITER ;

尽管MySQL在没有任何错误的情况下接受了写入的触发器,但在应用程序运行时会出现此错误:

 General error: 1442 Can't update table 'table2' in stored function/trigger 
    because it is already used by statement which invoked this stored function/trigger

我相信这来自MySQL触发器无法操纵它们被分配到的表。因此,如果这是错误的原因,我怎么能达到相同的结果?

编辑:(答案)

感谢mootinator在这里和聊天中的帮助。这是他的解决方案,因为我需要它。

CREATE TRIGGER new_trigger BEFORE INSERT on table2
FOR EACH ROW BEGIN
    INSERT INTO table3(att1, DateCreated, DateUpdated)
    VALUES('PG', now(), now());
    SET NEW.table3Id = LAST_INSERT_ID();
END;

1 个答案:

答案 0 :(得分:2)

您无法使用AFTER触发器,因为您所做的新更改(可能)会导致AFTER触发器在无限循环中再次运行。在编写之前,您必须使用BEFORE触发器编辑行

尝试例如:

CREATE TRIGGER new_trigger BEFORE INSERT on table2
FOR EACH ROW BEGIN
    INSERT INTO table3(att1, DateCreated, DateUpdated)
    VALUES('PG', now(), now());
    SET NEW.table3Id = LAST_INSERT_ID();
END;