gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 07:37:28 24 4
gpt4 key购买 nike

我有以下 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 语句仅在复合语句的上下文中起作用(即包含在 BEGINEND 之间的语句 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com