2013-08-07 48 views
1

我試圖用2個表在MySQL上創建一個觸發器。我可以在另一個數據庫中做到這一點,但在另一個數據庫中調整的相同代碼在幾小時內給我語法錯誤!更新查詢中的MySQL觸發語法錯誤

CREATE TRIGGER `free_video_used` AFTER UPDATE ON `user`  
FOR EACH ROW 
IF new.field = 1 THEN 
UPDATE free_video SET free_video.used = 1 WHERE free_video.uid = NEW.uid; 
END IF; 

正如你可以在桌子上「用戶」的更新後很容易地理解,其它的表被修改其中場「UID」是相等的。爲什麼它不工作?! 謝謝!

回答

1

嘗試:

DELIMITER $$ 

CREATE TRIGGER `free_video_used` AFTER UPDATE ON `user` 
FOR EACH ROW 
BEGIN 
    IF (new.field = 1) THEN 
     UPDATE free_video SET free_video.used = 1 WHERE free_video.uid = new.uid; 
    END IF; 
END$$ 

DELIMITER ; 
+0

現在,它的正常工作,我認爲這不是強制性的使用分隔符和開始結束塊,事實上我沒有在其他數據庫中使用它們。使用它們有什麼區別? 謝謝隊友! – user1638466

1

如果你在你的身體觸發多條語句,你必須BEGINEND之間括起來。見http://dev.mysql.com/doc/refman/5.0/en/trigger-syntax.html

通過使用BEGIN ... END結構,你可以定義一個觸發器, 執行多個語句。在BEGIN塊,你也可以使用允許存儲例程,如 條件語句內循環

這裏 其他語法,你必須寫東西

CREATE TRIGGER `free_video_used` AFTER UPDATE ON `user`  
FOR EACH ROW 
BEGIN 
IF new.field = 1 THEN 
UPDATE free_video SET free_video.used = 1 WHERE free_video.uid = NEW.uid; 
END IF; 
END 
+0

謝謝!那麼更新和哪裏被認爲是兩個不同的陳述? – user1638466

+0

@ user1638466編號'UPDATE ...'是一個*語句*,它有一個WHERE子句*。一般說來,一個聲明是以分號(';')結尾的。這裏有你的'UPDATE ...;'語句和'IF ... THEN ... END IF'流程控制語句。 –

+0

明白了,我很新,觸發器,你可以看到 – user1638466

1

你的代碼基本上是正確的,這是在同一語句中使用多個;的問題。

試試這樣說:

DELIMITER // 
    CREATE TRIGGER `free_video_used` AFTER UPDATE ON `user`  
    FOR EACH ROW 
    BEGIN 
     IF new.field = 1 THEN 
      UPDATE free_video SET free_video.used = 1 WHERE free_video.uid = NEW.uid; 
     END IF; 
    END 
// 

看到這個fiddle看到它的工作(注意,在sqlfiddle喲定義底欄上的分隔符//)

+0

以及我只是使用其他代碼,它工作正常,但真正的問題是什麼?我也只用了一個「;」它不起作用! 也謝謝你! – user1638466

+0

當你有多個語句時,你可以在mysql控制檯中使用分隔符。看到這個問題更好的解釋:http://stackoverflow.com/q/10259504/1385896 –

+0

好的再次感謝你;) – user1638466