我正在使用此查询在两个不同的列中添加行
START TRANSACTION;
SET @c=0;
INSERT INTO tbl_chart (acode,adesc) VALUES (2,'3');
INSERT INTO tbl_pics (ID ,adesc) VALUES (1,'1');
select ROW_COUNT() into @c ;
IF ( c > 0) THEN
COMMIT ;
ELSE
ROLLBACK;
END IF
并尝试检查row_count并将其值保存在变量c中。 但是这个查询会产生错误,并且在显示错误后也会保存数据。 问题出在哪里?
错误是这样的:
/* SQL Error (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 ( c > 0) THEN
COMMIT' at line 1 */
答案 0 :(得分:3)
取自另一篇文章MYSQL If statement in transaction causing error
MySQL无法识别以关键字IF开头的语句 作为有效的SQL语句。
IF语句仅适用于复合语句的上下文 (即BEGIN和END之间的一个语句块。 目前,复合语句仅在上下文中受支持 存储的程序(存储过程,函数或触发器。)
答案 1 :(得分:1)
正如Rahul所说,IF
语句仅适用于存储过程,函数或触发器。
我想补充一点,你根本不需要计算是否插入了多少行。以下是如何在存储过程中解决此问题的示例。但是,如果您更愿意在应用程序代码中实现它背后的逻辑,那么这是您的选择。
drop procedure if exists sp_my_transaction;
delimiter $$
create procedure sp_my_transaction()
begin
declare continue handler for sqlexception
begin
rollback;
exit procedure;
end;
start transaction;
INSERT INTO tbl_chart (acode,adesc) VALUES (2,'3');
INSERT INTO tbl_pics (ID ,adesc) VALUES (1,'1');
commit;
end $$
delimiter ;
然后,您将使用
执行该过程call sp_my_transaction();
它背后的逻辑是,用
定义declare continue handler for sqlexception
发生错误时该怎么办。如果发生这种情况并且您没有继续处理程序,则该过程将简单地中止,并且该事务仍将处于打开状态。在这种情况下,在发生错误的点之后的代码永远不会到达,因此您的事务也不会被提交。