2016-08-15 51 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

相關問題