2010-12-15 41 views
0

我正在写一个触发器来执行交叉表更新,但是我无法得到期望的结果。我正在处理一个参数,那就是messageId。使用messageId,我需要进入消息表并找到userId @messageId,然后更新他/她的分数:(@messageId从插入到第三个表中,所以它真的是NEW.messageId)MySQL中的交叉表更新

 UPDATE users 
     SET users.score = users.score + 1 
     WHERE users.id = messages.userId 

我需要从消息中选择messages.userId @messageId,但触发器不会让我做select语句,所以我有点卡住了!

我想这一点,这似乎并没有工作,要么:

 UPDATE users, messages 
     INNER JOIN messages ON messages.id = NEW.messageId 
     SET users.score = users.score + 1 
     WHERE users.id = messages.userId 

PS:我真的不希望选择任何内容,我只想引用它虽然消息表更新用户表,然后被引用NEW.messageId

+0

哪个表是触发器? – VoodooChild 2010-12-15 21:34:00

+0

第三张桌子,VoodooChild! – Mohamad 2010-12-15 21:42:21

+0

这样做没有INNER JOIN行吗?此场景中的逗号用作联接。 – csi 2010-12-15 21:56:43

回答

1

我不知道有一种方法可以将select语句插入到触发器中。但是,您可以使用下面的语法,如果你正在寻找一位监视用户的评分变化:

CREATE TRIGGER score_update 
    BEFORE UPDATE ON score_table 
    REFERENCING NEW ROW AS n, OLD ROW AS o 
    FOR EACH ROW 
    IF n.score <> o.score 
    THEN 
    END IF; 
; 
1

为了发生多表更新,需要有一个连接,即使连接表没有更新。一个简单的逗号可以用作简写,或者您可以使用任何JOIN语法。在你的情况下,只需添加消息。

 UPDATE users, messages 
     SET users.score = users.score + 1 
     WHERE users.id = messages.userId 
+0

克里斯托弗,问题是触发器来自第三个表,所以引用真的是New.messgeId – Mohamad 2010-12-15 21:45:07