试图在phpmyadmin中创建一个事务

时间:2017-05-20 14:22:41

标签: mysql stored-procedures phpmyadmin

尝试使用例程面板在phpmyadmin中创建事务。我想做一个插入和更新:

START TRANSACTION;

INSERT INTO inventoryitems (item, quantity, userid)
VALUES(item, quantity, userid);

UPDATE users
SET cash = cash - (quantity * unitbuyprice);

COMMIT;

您可以在下面的屏幕截图中看到创建/编辑例程面板:

Create Routine

以下是我得到的错误:

以下查询失败:“CREATE DEFINER = root @ localhost PROCEDURE InsertInventoryItem(IN item VARCHAR(255),IN quantity INT, IN userid INT,IN unitbuyprice INT)NOT DETERMINISTIC NO SQL SQL安全定义器启动事务;插入到库存项目(项目,数量,用户ID)VALUES(项目,数量,用户ID); UPDATE用户SET cash =现金 - (数量* unitbuyprice); COMMIT;“ MySQL说:#1064 - 你的SQL语法有错误;检查与MySQL服务器版本对应的手册,以便在'INSERT INTO inventoryitems(项目,数量,用户ID)VALUES(项目,数量,用户'在第3行)附近使用正确的语法

如果我删除了Start Transaction,Commit以及插入或更新,那么程序就可以了。 IE只是一个语句工作正常,但多个语句总是给出错误。

当我想在一个过程中包含多个语句时,我错过了什么。 我尝试过使用和不使用半冒号分隔符。

这个东西只适用于MS SQL。我之前已经创建了包含数百个语句的过程。

提前为帮助喝彩。

1 个答案:

答案 0 :(得分:1)

我建议您添加BEGINEND

另请注意:

  

局部变量的名称不应与表列相同。如果SQL语句...包含对列的引用和具有相同名称的声明的局部变量,则MySQL当前将该引用解释为变量的名称。

参考:https://dev.mysql.com/doc/refman/5.7/en/local-variable-scope.html

如果我们在存储程序的上下文中实现事务控制,我们可能还应该处理错误条件,并在存储的程序中发出回滚。 (就个人而言,我坚持认为我们应该处理存储过程的外部的事务上下文的思想学派。)

程序定义如下所示:

DELIMITER $$

CREATE DEFINER=root@localhost PROCEDURE InsertInventoryItem(
  IN as_item         VARCHAR(255),
  IN ai_quantity     INT,
  IN ai_userid       INT,
  IN ai_unitbuyprice INT
) 
BEGIN

  -- handle error conditions by issuing a ROLLBACK and exiting
  DECLARE EXIT HANDLER FOR SQLEXCEPTION
  BEGIN
    ROLLBACK;
    EXIT PROCEDURE;
  END;

  START TRANSACTION ;

  INSERT INTO inventoryitems (item, quantity, userid)
  VALUES (as_item, ai_quantity, ai_userid) ;

  UPDATE users u
  SET u.cash = u.cash - (ai_quantity * ai_unitbuyprice)
  WHERE u.userid = ai_userid ;

  COMMIT ;

END$$

DELIMITER ;

-

请注意,如果cashai_quantity为NULL,则更新将为ai_unitbuyprice分配NULL。我们可能想要一个WHERE子句来限制将要更新的行。 (如果没有WHERE子句,UPDATE语句将更新表中的所有行。)

如果我想从普通客户端(例如mysql命令行或SQLyog)创建过程,那么这些语句会是什么样子。

MySQL语法与Transact-SQL(Microsoft SQL Server)有很大不同。我们只需处理这个问题。

至于"这些东西只适用于MS SQL",公平地说,我们应该小心不要将MySQL本身与容易出错的idio t -syncracies混为一谈phpMyAdmin客户端。