2014-04-29 37 views
0

Mysql的語法錯誤,我有這樣的觸發與觸發

CREATE TRIGGER checkcollision AFTER UPDATE ON players BEGIN 
    SELECT RAISE(ABORT, 'collision') FROM walls WHERE NEW.x=x AND NEW.y=y; 
END; 

MySQL的5.1.72-0ubuntu0.10.04.1(Ubuntu的)

但我得到一個語法錯誤,我沒有看到其中...

編輯:

DELIMITER // 
CREATE TRIGGER checkcollision AFTER UPDATE ON players BEGIN SELECT RAISE(ABORT, 'collision') FROM walls WHERE NEW.x=x AND NEW.y=y; END// 
DELIMITER ; 

這仍然得到一個語法錯誤...

enter image description here

這是得到一個語法錯誤:

DELIMITER // 
CREATE TRIGGER checkcollision AFTER UPDATE ON players 
    FOR EACH ROW 
    BEGIN 
     IF (SELECT count(*) FROM walls WHERE NEW.x=x AND NEW.y=y)>0 THEN 
      SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Collision detected'; 
     END IF; 
    END;// 
DELIMITER ; 

enter image description here

+0

您可能沒有更改'DELIMITER'。 –

+0

我該怎麼做? – omega

+0

@omega:發佈整個語法錯誤消息。除非哪個,我們也看不到...... !!!? –

回答

0

你可能沒有改變DELIMITER

How do I do that?

隨着DELIMITER命令,這裏所描述

改變,當你創建觸發器或程序的分隔符,否則使用觸發器的體內分號語句分隔符是很重要的(例如,在SELECT語句的末尾)對於CREATE TRIGGER語句末尾的分號是不明確的。

這是MySQL開發人員非常常見的混淆之處。

+0

好吧我用delimeter添加了我的新代碼,但它仍然出現語法錯誤。 – omega

0

編輯1

How do I get it to roll back the change if there is a collision then

Rollbackcommit尚未觸發不允許的。
相反,您可以通過在條件失敗時設置特定的sqlstate來提高signal

IF (condition_for_collision_true) THEN 
    SET error_message = 'Invalid XYZ'; -- set proper message 

    -- set proper error state number 
    SIGNAL SQLSTATE <ERROR_STATE_NUMBER> SET message_text = error_message; 
END IF; 

這會導致事務中止。


原來的答覆

觸發器被解僱受影響的每一行。

而你在你的觸發器定義中缺少同樣的東西。

DELIMITER // 

CREATE TRIGGER checkcollision 
     AFTER UPDATE ON players 
     FOR EACH ROW 
BEGIN 
    SELECT RAISE(ABORT, 'collision') FROM walls WHERE NEW.x=x AND NEW.y=y; 
END; 

// 

DELIMITER ; 

而且,很明顯。觸發器不是常規例程。他們是爲背景行動。你不能指望他們返回一個遊標或任何其他結果。但是要執行一個操作,例如設置或重置一行中的值或對其他相關表格進行任何DML操作等。

相應地改變身體。

+0

這與MySQL 5.1,我不認爲它確實。 – omega

+0

是的。有條件的交易流產只有在MySQL 5.5之後纔有可能。建議使用黑客技術[* here *](http://dev.mysql.com/doc/refman/5.1/en/create-trigger.html#c8808)。 –