2016-06-01 4 views
1

私はMariaDbと彼のdocumentationを使用する場合 NEW.server_xp > OLD.server_prev_level_xp古いデータと新しいデータに基づいて条件付きの更新でトリガーを作成するにはどうすればいいですか?

フィールドserver_prev_level_xpを更新します。

私はこれを試してみたが、それは動作しません:私は間違って何をやっている

WHEN (NEW.server_xp > OLD.server_prev_level_xp) 

CREATE TRIGGER Level_Update 
AFTER UPDATE OF server_xp ON servers 
FOR EACH ROW 
WHEN (NEW.server_xp > OLD.server_prev_level_xp) 
BEGIN 
    SET NEW.server_prev_level_xp = OLD.server_prev_level_xp + OLD.server_prev_level_xp >> 1; 
    SET NEW.server_level = OLD.server_level + 1; 
END; 

は4行目にエラーがありますか?

+0

表のスキーマと正確なエラー情報を明記してください。 – mootmoot

+0

'IF'(NEW.server_xp> OLD.server_prev_level_xp)? – mootmoot

+0

どのようなエラーがありますか?なぜ更新後の値を変更するのですか? – symcbean

答えて

1

トリガーの作成に使用される構文は、MariaBD([OF <trigger Column list>]およびFOR EACH ROW [WHEN (search condition)])には適用されません。 CREATE TRIGGERを参照してください。

1つのオプションはIF Statementです。

覚えていること:Such a SET statement has no effect in an AFTER trigger because the row change will have already occurred.です。

DELIMITER // 

CREATE TRIGGER `Level_Update` /*AFTER*/ BEFORE UPDATE ON `servers` 
FOR EACH ROW 
BEGIN 
    IF NEW.`server_xp` > OLD.`server_prev_level_xp` THEN 
    . 
    . 
    . 
    END IF; 
END// 

DELIMITER ; 
0

使用この:

DELIMITER // 

CREATE TRIGGER `Level_Update` BEFORE UPDATE ON shp_servers 
FOR EACH ROW 
BEGIN 
    IF NEW.`server_xp` > OLD.`server_level_xp` THEN 
     SET NEW.`server_level_xp` = OLD.`server_level_xp` + OLD.`server_level_xp` >> 1; 
    END IF; 
END// 

DELIMITER ; 

持っている:

1419 - あなたは変数少ない安全なlog_bin_trust_function_creatorsを使用する場合がありますあなたはSUPER権限とバイナリログが有効になっている必要はありません( )

試してみてください:

CREATE TRIGGER `Level_Update` BEFORE UPDATE ON shp_servers 
    FOR EACH ROW 
    BEGIN 
     IF NEW.`server_xp` > OLD.`server_level_xp` THEN 
      SET NEW.`server_level_xp` = OLD.`server_level_xp` + OLD.`server_level_xp` >> 1; 
     END IF; 
    END 

あり:

1064 - SQL構文に誤りがあります。 5行目

関連する問題