[英]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 :
如果發生沖突,我該如何退回更改
觸發器中不允許Rollback
, commit
。
相反,您可以通過在條件失敗時設置特定的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.