2013-04-02 2 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; 

Проблема заключается в том, что она возвращает ошибку в если заявление:

# 1064 - У вас есть ошибка в синтаксисе SQL; проверьте руководство, которое соответствует версии сервера MySQL для правильного синтаксиса использовать вблизи «если (@a> 1), а затем COMMIT» в строке 1

Я смотрел на переполнение стека и есть answer showing a similar query, написанные практически так же, но они используют переменную без символа @. Удаление @ для моего запроса не решает проблему.

Это всего лишь тестовый запрос, чтобы опробовать некоторые транзакции с использованием MYSQL, поэтому запрос кажется немного бессмысленным. Я немного застрял.

ответ

2

MySQL не признает оператор, начинающийся с ключевого слова IF как действительный оператор SQL.

IF оператор работает только в контексте составного оператора (то есть, блок операторов, заключенных между BEGIN и END. В настоящее время Составной оператор поддерживается только в контексте хранимой программы (хранимой процедуры, функции или триггер)

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/о/поток управление-functions.html –