尝试使用例程面板在 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 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。我之前创建过包含数百条语句的过程。
提前为帮助干杯。
最佳答案
我建议您添加 BEGIN
和 END
。
另请注意:
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_quantity
或 ai_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/