簡體   English   中英

MySQL語法錯誤與觸發器

[英]Mysql syntax error with trigger

我有這個觸發

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 ;

這仍然出現語法錯誤...

在此處輸入圖片說明

這得到語法錯誤:

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 ; 

在此處輸入圖片說明

您可能沒有更改DELIMITER

我怎么做?

使用DELIMITER命令,如下所述

在創建觸發器或過程時,更改定界符很重要,因為否則,在觸發器主體內使用分號語句定界符(例如,在SELECT語句的末尾)相對於分號末尾的分號是模棱兩可的CREATE TRIGGER語句。

對於MySQL開發人員來說,這是一個非常常見的困惑源。

編輯1

如果發生沖突,我該如何退回更改

觸發器中不允許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操作等操作。

相應地更改身體。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM