mysql - 尝试在 phpmyadmin 中创建事务

标签 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 SECURITY DEFINER 开始事务;插入 inventoryitems (商品、数量、用户 ID) VALUES(商品、数量、用户 ID); 更新用户 SET 现金 = 现金 - (数量 * 单位购买价格); 提交;" MySQL 说:#1064 - 你的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,了解在第 3 行的 'INSERT INTO inventoryitems (item, amount, userid) VALUES(item, amount, user') 附近使用的正确语法

如果我删除“开始事务”、“提交”以及“插入”或“更新”,那么该过程就可以了。 IE 中只有一条语句可以正常工作,但多条语句总是会出错。

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

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

提前为帮助干杯。

最佳答案

我建议您添加 BEGINEND

另请注意:

A local variable should not have the same name as a table column. If an SQL statement ... contains a reference to a column and a declared local variable with the same name, MySQL currently interprets the reference as the name of a variable.

引用: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 同步混为一谈。

关于mysql - 尝试在 phpmyadmin 中创建事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44087007/

相关文章:

postgresql - Postgres : how to add unique identifier to table

bash - 从 Bash 脚本在 PostgreSQL 中创建 FUNCTION

MySQL存储过程问题。抛出警告。想不通为什么?

mysql - 在 phpmyadmin 中将列插入到预先存在的表中

php - 我无法在服务器上使用 phpmyadmin 进行操作

php - MariaDB 错误与看似正确的事务 SQL

mysql - 无法在数据库中添加日期

MySQL - 按时间获取最后一个条目(如果为空则为第一个)

java - 如何使用 EJB 实体 bean 连接到 mysql 数据库?

MySQL:如何显示以逗号分隔的 1 列中的数据?