【问题标题】:Trying to create a transaction in phpmyadmin尝试在 phpmyadmin 中创建事务
【发布时间】:2017-10-20 14:02:24
【问题描述】:

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

START TRANSACTION;

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

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

COMMIT;

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

以下是我得到的错误:

以下查询失败:“CREATE DEFINER=root@localhostPROCEDURE InsertInventoryItem(IN item VARCHAR(255), IN quantity INT, IN userid INT, IN unitbuyprice INT) NOT DETERMINISTIC NO SQL SQL SECURITY DEFINER START TRANSACTION; INSERT INTO inventoryitems (item, quantity, userid) VALUES(item, quantity, userid); UPDATE users SET cash = cash - (quantity * unitbuyprice); COMMIT;" MySQL 说:#1064 - 你的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 3 行的“INSERT INTO inventoryitems (item, quantity, userid) VALUES(item, quantity, user' 附近使用正确的语法

如果我删除 Start Transaction、Commit 和 insert 或 update,那么程序就可以了。 IE 单条语句可以正常工作,但多条语句总是报错。

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

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

提前为帮助干杯。

【问题讨论】:

    标签: mysql stored-procedures phpmyadmin


    【解决方案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 ;
    

    --

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

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

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

    至于“这些东西只适用于 MS SQL”,平心而论,我们应该小心不要将 MySQL 本身与 phpMyAdmin 客户端的容易出问题的 idiot-syncracies 混为一谈。

    【讨论】:

    • 感谢您的快速回复。我只是通过添加 BEGIN 和 END 来让它自己工作。现在将根据您的示例实现 Exit 处理程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-30
    • 1970-01-01
    • 2013-11-10
    • 2014-05-18
    • 2019-10-25
    • 1970-01-01
    • 2021-06-13
    相关资源
    最近更新 更多