为什么我不能在MySQL中使用触发器?

时间:2013-08-09 10:32:29

标签: mysql triggers

我正在为我的学校图书馆做一个项目。有一个会员表,其中包含注册日期,到期日期和续订日期属性。现在,当一个新会员注册时,我希望有一个触发器,它将插入注册日期,续订日期的当前日期,并且由于会员资格有效期为2年,因此到期日应设置为距当前日期两年。现在我已经为此编写了触发器,但是当我去插入新成员时,我收到以下错误。

  • 错误代码:1442。无法更新存储函数/触发器中的表'member',因为它已被调用此存储函数/触发器的语句使用。

这是我的触发器

DELIMITER $$
create trigger regDate
before insert on member
for each row begin
    set @currentDate = CURDATE();
    set @expDate = ADDDATE(@currentDate, INTERVAL 2 year);
    insert into member(regDate, expDate, renewDate) values (@currentDate, @expDate, @currentDate);
end$$

我已经找到了一个解决方案,只有在有人说这是MySQL中的错误时才会走到尽头!

2 个答案:

答案 0 :(得分:2)

请参阅trigger FAQ

  

触发器可以访问自己的表中的旧数据和新数据。触发器也可以影响其他表,但是不允许修改已经被调用函数或触发器的语句使用(用于读取或写入)的表。(在MySQL 5.0之前)。 10,触发器不能修改其他表。)

在这种情况下,您在触发器中没有insert 显式,只需更改new.<columnName>值,触发器将使用该值自动修改行。

换句话说,替换:

insert into member(regDate, expDate, renewDate) values (
    @currentDate, @expDate, @currentDate);

使用:

set new.regDate = @currentDate;
set new.expDate = @expDate;
set new.renewDate = @currentDate;

trigger syntax page上有一些不错的例子,请记住可以从old.<columnName>访问旧的行数据值。

答案 1 :(得分:1)

尝试通过NEW分配值:

DELIMITER $$
create trigger regDate
before insert on member
for each row begin
    set @currentDate = CURDATE();
    set @expDate = ADDDATE(@currentDate, INTERVAL 2 year);
    set new.regDate = @currentDate;
    set new.expDate = @expDate;
    set new.renewDate= @currentDate;
end$$
相关问题