MySQL事务和变量的问题

时间:2017-04-27 01:49:33

标签: mysql sql variables if-statement transactions

我正在尝试建立一个流程,我的团队可以使用变量和基本脚本进行常规数据库更改。我只是在许多操作中的第一个,甚至无法执行它。我们的想法是在脚本顶部分配变量,并说明是否要以testprod模式运行脚本。

test应该只是模拟更改,向您展示会发生什么并将事务回滚,而prod将实际提交事务并显示更新的行。

当我单独运行这些行时,它们可以工作,但总是会说语法错误。我很乐意帮助调试这个,但如果有人有更好的解决方案来解决这个问题,我很乐意听到它。

好的,这是启动代码,提前谢谢!

#ADD A NEW QUESTION CATEGORY
SET @new_category_name = 'NEW CATEGORY NAME HERE';
SET @prod_or_test = 'PROD';

START TRANSACTION;
#SET IT'S SORT_ORDER TO BE AT THE END OF THE LIST
SET @last_sort_order = ((SELECT MAX(`sort_order`) FROM question_categories)+1);

#INSERT THE NEW ROW
INSERT INTO question_categories (name, sort_order) VALUES (@new_category_name, @last_sort_order);
IF (@prod_or_test = 'PROD') THEN
  COMMIT;
  SELECT * FROM question_categories WHERE name = @new_category_name;
ELSE
  ROLLBACK;
END IF;

更新以包含错误消息:

[ERROR in query 6] 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 (@prod_or_test = 'PROD') THEN
  COMMIT' at line 1
[ERROR in query 8] 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 'ELSE
  ROLLBACK' at line 1
[ERROR in query 9] 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 'END IF' at line 1

2 个答案:

答案 0 :(得分:1)

IFTHENELSEEND IF不是MySQL 存储程序上下文之外的有效SQL语句。例如,PROCEDURE或TRIGGER定义。

参考:https://dev.mysql.com/doc/refman/5.7/en/if.html

IF语句可以在存储的程序中使用,但不能用作独立的SQL语句。

此外,IF语句不应与IF()函数混淆,SELECT函数可用于UPDATE SELECT t.foo, IF(t.foo='bar',41,NULL) AS bar, ... 等语句的上下文中,这是有效的SQL语句。

IF

某些语句包含 DROP TABLE IF EXISTS foo; 关键字作为其语法的一部分,例如:

IF

请注意,在此示例中,DROP关键字是IF语句的一部分;这不是一个单独的声明。

<强>后续

  

最终目标是拥有一个脚本......但是......看起来我实际上正在尝试通过此脚本调用一些存储过程。

原始答案(上面)解决了MySQL存储程序之外的IF语句的使用问题。如果您需要使用IF语句,那么可以在PROCEDURE中完成。

但是,并非严格要求PREPARE语句。您可以使用EXECUTEDEALLOCATE PREPAREIF()语句完成几乎相同的操作来执行动态创建的SQL。

参考:https://dev.mysql.com/doc/refman/5.7/en/sql-syntax-prepared-statements.html

例如,我们可以对SELECT语句中的COMMIT函数中的用户定义变量执行条件测试,并有条件地返回要执行的SQL文本。在这种情况下,可以是ROLLBACK -- add a new question category SET @new_category_name := 'NEW CATEGORY NAME HERE'; SET @prod_or_test := 'PROD'; START TRANSACTION; -- set it's sort_order to be at the end of the list SELECT IFNULL(MAX(`sort_order`)+1,1) FROM question_categories INTO @last_sort_order ; -- insert the new row INSERT INTO question_categories (name, sort_order) VALUES (@new_category_name, @last_sort_order) ; -- conditionally execute a COMMIT or ROLLBACK SELECT IF(@prod_or_test='PROD','COMMIT','ROLLBACK') INTO @sql; PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SELECT * FROM question_categories WHERE @prod_or_test = 'PROD' AND name = @new_category_name ; 语句。

我认为这样的事情会起作用:

{{1}}

答案 1 :(得分:0)

问题是括号

IF (@prod_or_test = 'PROD') THEN

IF @prod_or_test = 'PROD' THEN

语法

IF search_condition THEN statement_list
    [ELSEIF search_condition THEN statement_list] ...
    [ELSE statement_list]
END IF

https://dev.mysql.com/doc/refman/5.7/en/if.html