我很难得到一个程序来更新表的方式,我需要。我正在本地计算机上使用phpmyadmin。在phpmyadmin中,我可以将以下代码放入sql选项卡,其中一行将被更新:
SET `adjCost` = 22.05 WHERE `Name` LIKE CONCAT('magic', '%') AND `idKey` = '2016fulham02345';
正如所料,如果名称以magic开头,idkey是'2016fulham02345',那么adjcost将更新为22.05。
将有2到50行具有相同的idkey。在具有相同idkey的集合中,该名称永远不会重复。
我用以下参数创建了一个过程:
IN idK VARCHAR 255 Charset
IN aName VARCHAR 255 Charset
IN cost FLOAT 5,2
BEGIN
UPDATE `raceresults` SET `adjCost` = cost WHERE `Name` LIKE CONCAT(aName, '%') AND `idKey` = idK;
END
当我运行这个过程时,它会更新所有adjcost,其中idkey=idk并且(似乎)忽略name参数。
我已尝试先连接名称字符串:
BEGIN
SELECT CONCAT(aName, '%') INTO @str;
UPDATE `raceresults` SET `adjCost` = cost WHERE `Name` = @str AND `idKey` = idK;
END
但无济于事。
我浏览了w3schools、stackoverflow和google,都没有找到答案。
我的问题是:
我怎样才能纠正我的程序,让它工作,因为我想?
更新:按要求。
CREATE DEFINER=`root`@`localhost` PROCEDURE `importAltUpdateAjdCost`(IN `idK` VARCHAR(255), IN `aName` VARCHAR(255), IN `cost` FLOAT(5,2))
NO SQL
BEGIN
UPDATE `costingPP`
SET `adjCost` = cost
WHERE
`Name` LIKE CONCAT(aName, '%')
AND
`idKey` = idK;
END
为了得到这个结果,我在phpmyadmin上的程序列表中选择了export。
1条答案
按热度按时间xxls0lw81#
我不完全确定你做了什么或者怎么做的,但这是我做的,它立刻就起作用了。因为您没有指定mysql版本,所以我使用了5.7。
edit:现在当我回去查看您的过程创建语句时,我意识到mysql 8.0中没有引入sql。由于您的过程显然是sql,那么请删除no-sql并重新创建该过程。
我将MySQL5.7示例留在这里供参考:
1) 创建了一个简单的表:
2) 这里我们插入一个示例数据行:
3) 要创建(存储)过程,我们必须临时设置一个不同的分隔符,这样查询解析器就不会在默认分号上终止过程创建,因为它在过程内部使用。在分隔符更改之后,我们创建过程并将分隔符设置回分号
4) 现在让我们看看这一切是如何运作的。在过程调用之前和之后,我从数据库中选择行。您可以看到“成本”列的值正在更改:
现在还有一条建议:如果可能的话,只使用小写的表、列、索引、函数、过程等。。。名称,同时总是以大写形式编写所有sql命令(您确实这样做了)。这是一种事实上的标准,它使您和其他阅读您的代码的人的生活更加轻松。