- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有以下 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 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'if (@a > 1) then COMMIT' at line 1
我查看了堆栈溢出并且有一个 answer showing a similar query ,以几乎相同的方式编写,但他们使用的变量没有 @
符号。为我的查询删除 @
并不能解决问题。
这只是一个测试查询,用于尝试使用 MYSQL 进行一些交易,因此查询看起来有点毫无意义。我有点卡住了。
最佳答案
MySQL 不会将以关键字 IF
开头的语句识别为有效的 SQL 语句。
IF
语句仅在复合语句的上下文中起作用(即包含在 BEGIN
和 END
之间的语句 block 。目前,仅在存储程序(存储过程、函数或触发器)的上下文中支持复合语句。
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。)
关于MYSQL If语句在事务中导致错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15766336/
我是一名优秀的程序员,十分优秀!