1

私は学校の図書館のプロジェクトを行っています。登録日、有効期限、および更新日の属性を持つ Member テーブルがあります。今、新しいメンバーが登録しているときに、登録日、更新日に現在の日付を挿入するトリガーが必要です。メンバーシップは 2 年間有効であるため、有効期限は現在の日付から 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 のバグだと言うところで行き止まりになりました!

4

2 に答える 2

2

トリガー 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;

トリガー構文のページに適切な例がいくつかあります。古い行データ値には からアクセスできることを覚えておいてください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 に答える