MYSQL If语句在事务中导致错误

时间:2013-04-02 14:10:53

标签: mysql variables transactions

我有以下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服务器版本对应的手册,以便在第1行的'if(@a> 1)然后COMMIT'附近使用正确的语法

我查看了堆栈溢出,并且有一个answer showing a similar query,以相同的方式编写,但是它们使用的是没有@符号的变量。删除查询的@无法解决问题。

这只是一个使用MYSQL尝试一些事务的测试查询,因此查询看起来有点无意义。我有点卡住了。

1 个答案:

答案 0 :(得分: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。)