尝试使用例程面板在phpmyadmin中创建事务。我想做一个插入和更新:
START TRANSACTION;
INSERT INTO inventoryitems (item, quantity, userid)
VALUES(item, quantity, userid);
UPDATE users
SET cash = cash - (quantity * unitbuyprice);
COMMIT;
您可以在下面的屏幕截图中看到创建/编辑例程面板:
以下是我得到的错误:
以下查询失败:“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。我之前已经创建了包含数百个语句的过程。
提前为帮助喝彩。
答案 0 :(得分:1)
我建议您添加BEGIN
和END
。
另请注意:
局部变量的名称不应与表列相同。如果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 ;
-
请注意,如果cash
或ai_quantity
为NULL,则更新将为ai_unitbuyprice
分配NULL。我们可能想要一个WHERE子句来限制将要更新的行。 (如果没有WHERE子句,UPDATE语句将更新表中的所有行。)
如果我想从普通客户端(例如mysql命令行或SQLyog)创建过程,那么这些语句会是什么样子。
MySQL语法与Transact-SQL(Microsoft SQL Server)有很大不同。我们只需处理这个问题。
至于"这些东西只适用于MS SQL",公平地说,我们应该小心不要将MySQL本身与容易出错的idio t -syncracies混为一谈phpMyAdmin客户端。