【问题标题】:MySql update. difference between procedure results and phpmyadmin sqlMySql 更新。过程结果和phpmyadmin sql之间的区别
【发布时间】:2019-02-14 08:53:55
【问题描述】:

我很难获得以我需要的方式更新表的过程。我在本地计算机上使用 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

当我运行此过程时,它会更新 idKey = idk 的所有 adjCost 并且(似乎)忽略 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 上的程序列表中选择了导出。

【问题讨论】:

  • 出于好奇,SELECT @str := CONCAT(aName, '%');也失败了?
  • 它没有改变任何 adjCost。
  • 这些真的用在过程定义中了吗? IN idK VARCHAR 255 Charset IN aName VARCHAR 255 Charset IN cost FLOAT 5,2 如果您真的需要帮助,请粘贴您的实际过程定义 SQL
  • 我是 MySQL 新手。我很乐意发布实际的程序定义,但老实说,我不知道那是什么。
  • 请编辑您帖子的“我使用以下参数创建了一个过程”部分并使用以“CREATE ...”开头的实际过程创建查询

标签: mysql sql-like concat


【解决方案1】:

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

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

我将我的 MySQL 5.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 命令(您也这样做了)。这是一种事实上的标准,让您和其他阅读您的代码的人的生活更轻松。

【讨论】:

  • 仔细阅读您的回答后,我很高兴也很感激它解决了我的问题。另外,你教了我一些我将来会用到的东西。再次感谢。编辑:我确实尝试过提供积极的反馈,但我不能公开这样做,因为我是新用户。
  • 不客气 :) 点赞也无妨 ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-26
  • 1970-01-01
  • 1970-01-01
  • 2018-01-05
  • 2012-01-23
  • 1970-01-01
  • 2020-11-20
相关资源
最近更新 更多