MySql 更新。程序结果和 phpmyadmin 之间的区别 sql

MySql update. difference between procedure results and phpmyadmin sql

我很难获得按照我要求的方式更新 table 的程序。我在本地计算机上使用 phpmyadmin。在 phpmyadmin 中,我可以将以下代码放入 SQL 选项卡,一行将被更新:

SET `adjCost` = 22.05 WHERE `Name` LIKE CONCAT('magic', '%') AND `idKey` = '2016fulham02345';

正如预期和希望的那样,如果名称以 magic 开头且 idKey 为“2016fulham02345”,则 adjCost 将更新为 22.05。

将有 2 到 50 行具有相同的 idKey。 Name 永远不会在具有相同 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 并且(似乎)忽略名称参数。

我试过先连接名称字符串:

BEGIN 
    SELECT CONCAT(aName, '%') INTO @str; 
    UPDATE `raceresults` SET `adjCost` = cost WHERE `Name` = @str AND `idKey` = idK; 
END

但无济于事。

我查看了 w3schools、Whosebug 和 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 的程序列表中选择了导出。

我不完全确定你做了什么或怎么做,但这是我所做的并且立即奏效。由于您没有指定 MySQL 版本,我使用的是 5.7。

编辑:现在当我回去查看您的过程创建语句时,我意识到 NO SQL 是在 MySQL 8.0 中引入的。由于您的程序显然是 SQL 那么请删除 NO SQL 并重新创建程序。

我将 MySQL 5.7 示例留在这里供参考:

1) 创建了一个简单的 table:

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) 要创建一个 (STORED) PROCEDURE,我们必须临时设置一个不同的定界符,因此查询解析器不会在默认分号处终止过程创建,因为它在过程内部使用。分隔符更改后,我们创建过程并将分隔符设置回分号

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)

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