2013-04-02 55 views
4

我有以下MySQL查詢:MYSQL如果在交易聲明中造成錯誤

START TRANSACTION; 

SELECT sport_id INTO @a FROM sports WHERE sport_id = 2 FOR UPDATE; 

UPDATE sports SET sport_name = 'Table Tennis' WHERE sport_id = @a; 

if (@a > 1) then 
    COMMIT; 
ELSE 
    ROLLBACK; 
END IF; 

的問題是,它在if語句返回一個錯誤:

#1064 - 你有一個錯誤在你的SQL語法中;檢查對應於你的MySQL服務器版本的手冊正確的語法使用近「如果(@a> 1),然後提交」在1號線

我看着堆棧溢出,並有一個answer showing a similar query,以幾乎相同的方式編寫,但他們使用的變量沒有@符號。刪除我的查詢@不能解決問題。

這只是一個測試查詢,嘗試使用MYSQL進行一些事務,因此查詢看起來有點沒有意義。我有點卡住了。

回答

2

MySQL無法識別以關鍵字IF開頭的語句作爲有效的SQL語句。

IF語句只能工作在一個複合語句(即,BEGINEND之間包圍一個語句塊。目前,複合語句中所存儲的程序的上下文中僅支持的上下文(存儲過程,函數或觸發)

http://dev.mysql.com/doc/refman/5.5/en/begin-end.html

爲了進行測試,嘗試...

DELIMITER // 

CREATE PROCEDURE usp_test_transaction() 
BEGIN 
    DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK; 
    START TRANSACTION; 

    -- whatever DML operations and SELECT statements you want to perform go here 

    IF (1=1) THEN 
    COMMIT; 
    ELSE 
    ROLLBACK; 
    END IF; 
END// 

DELIMITER ; 

CALL usp_test_transaction; 

(注意:我不主張在這裏該事務是在存儲過程內處理的。我個人的偏好是不這樣做,而是處理更高級別的交易。但上面的例子應該工作;我相信MySQL確實支持在存儲過程的上下文中調用START TRANSACTION,COMMIT和ROLLBACK。)

+0

感謝您的評論。我剛剛嘗試在語句周圍添加BEGIN END,並且它仍然出現相同的錯誤。您能否推薦我將BEGIN和END語句解決問題的位置? – Luke

+0

BEGIN ... END語法用於編寫複合語句,它可以出現在存儲程序(存儲過程和函數,觸發器和事件)中。 http://dev.mysql.com/doc/refman/5.5/en/stored-programs-defining.html – spencer7593

+0

或者你可以嘗試使用case操作符 :http://dev.mysql.com/doc/refman/ 5.0/EN /控制流-functions.html –