2

テーブル users があり、列 userPoints と userStatus があります

各ユーザーは初心者として始めます。userPoints が 100 に達した場合、ユーザー ステータスは別のものに変更されます。

別のテーブルがあります userStatuses statusId statusName minPoints maxPoints

userStatuses テーブルに従って、userPoints が 100 に達したときに発生するトリガーを作成できますか?

テーブルのステータス

id  statusName  minimumPoints   maximumPoints

1   lvl1            0               100
2   lvl2            101             1000
3   lvl3            1001            5000
4   lvl4            5001            20000
5   lvl5            20000           100000
4

3 に答える 3

1

これを試して:

delimiter //
CREATE TRIGGER changeUserStatus BEFORE UPDATE ON users
FOR EACH ROW
BEGIN
     IF NEW.userPoints > 100 THEN
         SET NEW.userStatus = 'lvl2';
     END IF;
END;//
delimiter ;

delimiterトリガー定義内でセミコロンを使用できます。

もちろん、ハードコーディングすることを前提としています。代わりにテーブルを参照したい場合は、別のアプローチを使用します。

編集:テーブル(編集した質問で提供したもの)を参照したい場合statuses、アプローチは更新するレコードの数によって異なります。

一気に更新する場合は、

delimiter //
CREATE TRIGGER changeUserStatus BEFORE UPDATE ON users
FOR EACH ROW
BEGIN
     SET @status = (
         SELECT statusName
         FROM statuses
         WHERE NEW.userPoints BETWEEN s.minimumPoints AND s.maximumPoints
     );
     IF @status <> NEW.userStatus:
         SET NEW.userStatus = @status;
     END IF;
END;//
delimiter ;

ただし、一度に多数のレコードを更新する場合は、最後に 1 つのクエリを実行する方がパフォーマンスが向上する可能性があります。残念ながら、MySQL は行ごとに 1 つの操作を実行するトリガーのみを許可します。

したがって、ストアドプロシージャを作成します

CREATE PROCEDURE refreshUserStatuses
     UPDATE users u
         JOIN statues s ON u.userPoints BETWEEN s.minimumPoints AND s.maximumPoints
     SET u.userStatus = s.statusName;

CALL refreshUserStatuses;ユーザーを更新した後に実行する必要があります。

于 2013-10-27T16:43:36.097 に答える