like-mysql更新过程结果和phpMyAdminSQL之间的差异

shyt4zoc  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(299)

我很难得到一个程序来更新表的方式,我需要。我正在本地计算机上使用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。

xxls0lw8

xxls0lw81#

我不完全确定你做了什么或者怎么做的,但这是我做的,它立刻就起作用了。因为您没有指定mysql版本,所以我使用了5.7。
edit:现在当我回去查看您的过程创建语句时,我意识到mysql 8.0中没有引入sql。由于您的过程显然是sql,那么请删除no-sql并重新创建该过程。
我将MySQL5.7示例留在这里供参考:
1) 创建了一个简单的表:

mysql> CREATE TABLE raceresults (
->   idKey VARCHAR(255),
->   Name VARCHAR(255),
->   adjCost FLOAT(5,2)
-> );
Query OK, 0 rows affected (0.06 sec)

2) 这里我们插入一个示例数据行:

mysql> INSERT INTO raceresults VALUES ('2016fulham02345', 'magicFlyingHorse', 0.00);
Query OK, 1 row affected (0.01 sec)

3) 要创建(存储)过程,我们必须临时设置一个不同的分隔符,这样查询解析器就不会在默认分号上终止过程创建,因为它在过程内部使用。在分隔符更改之后,我们创建过程并将分隔符设置回分号

mysql> DELIMITER //
mysql> CREATE PROCEDURE update_test(IN idK VARCHAR(255), IN aName VARCHAR(255), IN cost FLOAT(5,2))
-> BEGIN
->     UPDATE `raceresults` SET `adjCost` = cost WHERE `Name` LIKE CONCAT(aName, '%') AND `idKey` = idK;
-> END//
mysql> DELIMITER ;
Query OK, 0 rows affected (0.00 sec)

4) 现在让我们看看这一切是如何运作的。在过程调用之前和之后,我从数据库中选择行。您可以看到“成本”列的值正在更改:

mysql> SELECT * FROM raceresults;
+-----------------+------------------+---------+
| idKey           | Name             | adjCost |
+-----------------+------------------+---------+
| 2016fulham02345 | magicFlyingHorse |    0.00 |
+-----------------+------------------+---------+
1 row in set (0.00 sec)

mysql> CALL update_test('2016fulham02345', 'magic', 1.23);
Query OK, 1 row affected (0.02 sec)

mysql> SELECT * FROM raceresults;
+-----------------+------------------+---------+
| idKey           | Name             | adjCost |
+-----------------+------------------+---------+
| 2016fulham02345 | magicFlyingHorse |    1.23 |
+-----------------+------------------+---------+
1 row in set (0.00 sec)

现在还有一条建议:如果可能的话,只使用小写的表、列、索引、函数、过程等。。。名称,同时总是以大写形式编写所有sql命令(您确实这样做了)。这是一种事实上的标准,它使您和其他阅读您的代码的人的生活更加轻松。

相关问题