2016-08-15 77 views
0

我正在做一个触发器,当我更新一个表时,同一张表更新一个字段。 触发是:如何触发一个表并更新同一个表?

CREATE TRIGGER update_user 
AFTER UPDATE 
ON users 
FOR EACH ROW 
BEGIN 
    IF (NEW.totalPoints > 0 AND NEW.totalPoints < 200) 
    THEN 
     updateUser("rank 1", NEW.ID); 
    ELSEIF (NEW.totalPoints > 200 AND NEW.totalPoints < 400) 
    THEN 
     updateUser("rank 2", NEW.ID); 
    END IF; 
END; 

和程序是:

CREATE PROCEDURE updateUser(newRank VARCHAR(100), IDUser INT) 
BEGIN 
    UPDATE users SET rank = newRank WHERE ID = IDUser; 
END; 

我的错误是在创建过程:

1064 - 你在你的SQL语法错误;检查与您的MySQL服务器版本相对应的手册,以便在第3行使用正确的语法

感谢您的帮助!

+0

嘿!下面是你不应该从触发器调用函数的原因:http://dba.stackexchange.com/questions/10657/call-a-stored-procedure-from-a-trigger –

+0

而不是'updateUser(“rank 1” ,NEW.ID);''你可以使用'SET NEW.rank ='rank 1';' –

+0

我thik你应该使用分隔符 – jophab

回答

0

使用BEFORE更新触发器。但是,你不能真正使用的程序用于此目的:

CREATE TRIGGER update_user BEFORE UPDATE ON users 
FOR EACH ROW 
BEGIN 
    IF (NEW.totalPoints > 0 AND NEW.totalPoints < 200) 
    THEN 
     SET NEW.rank = 'rank 1'; 
    ELSEIF (NEW.totalPoints > 200 AND NEW.totalPoints < 400) 
    THEN 
     SET NEW.rank = 'rank 2'; 
    END IF; 
END; 

修改该数据将是很难在触发使用存储过程。

编辑:

如果其表示为:

SET NEW.RANK = (CASE WHEN NEW.totalPoints > 0 AND NEW.totalPoints < 200 
        THEN 'rank 1' 
        WHEN NEW.totalPoints > 200 AND NEW.totalPoints < 400 
        THEN 'rank 2' 
        ELSE NEW.RANK 
       END); 

由于没有IF逻辑可言。

+0

我试过这个,但错误是相同的,靠近''在第6行 – Ary

0

让我们试着用分隔符

DELIMITER $$  
    CREATE TRIGGER update_user AFTER UPDATE ON users 
    FOR EACH ROW 
    BEGIN 
     IF (NEW.totalPoints > 0 AND NEW.totalPoints < 200) 
     THEN 
      SET NEW.rank = 'rank 1'; 
     ELSEIF (NEW.totalPoints > 200 AND NEW.totalPoints < 400) 
     THEN 
      SET NEW.rank = 'rank 2'; 
     END IF; 
    END$$ 
    DELIMITER ; 
+0

不,它说只是错误 – Ary

+0

没有错误代码? – jophab

+0

没有错误代码... – Ary

相关问题