mysql - MySQL 事务和变量的问题

标签 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

最佳答案

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

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

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

此外,IF 语句不应与 IF() 函数混淆,后者可以在诸如 等语句的上下文中使用SELECTUPDATE,它们是有效的 SQL 语句。

  SELECT t.foo, IF(t.foo='bar',41,NULL) AS bar, ...   

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

  DROP TABLE IF EXISTS foo; 

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

<小时/>

跟进

"the end goal was to have one script ... but ... it's looking like I actually am trying to have some stored procedures that can be called via this script."

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

但是,IF 语句并不是严格必需的。您可以使用 PREPAREEXECUTEDEALLOCATE PREPARE 语句执行动态创建的 SQL 来完成几乎相同的事情。

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

例如,我们可以在 SELECT 语句中的 IF() 函数中对用户定义的变量执行条件测试,并有条件地返回要执行的 SQL 文本。在本例中,为 COMMITROLLBACK 语句。

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

 -- 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 ;

关于mysql - MySQL 事务和变量的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43647340/

相关文章:

bash - shell脚本变量值

c# - 在数据库中搜索值并获取信息 c# Forms

sql - 迭代大型外部 postgres db,操作行,将输出写入 rails postgres db

php - 如何使用 PHP 在 MySQL 中插入嵌套数组

sql - 如何将地理位置批量插入到新的SQL Server 2008表中

java - informix中如何避免锁异常

c - 如何在另一个变量中使用变量引用?

c++ - 随机变量名,可能吗?

Mysql过程IF,ELSE IF语句错误

mysql - RDS 实例 CPU 利用率