1

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

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

这是我的触发器

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 中的一个错误!

4

2 回答 2

2

请参阅触发器常见问题解答

触发器可以访问自己表中的旧数据和新数据。触发器也可以影响其他表,但不允许修改已被调用函数或触发器的语句使用(用于读取或写入)的表。(在 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;

触发器语法页面上有一些不错的示例,请记住旧的行数据值可以从old.<columnName>.

于 2013-08-09T10:35:40.127 回答
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$$
于 2013-08-09T10:37:16.210 回答