2010-12-15 79 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