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 命令(你这样做了)。这是一种事实上的标准,让您和阅读您代码的其他人的生活更轻松。
我很难获得按照我要求的方式更新 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 命令(你这样做了)。这是一种事实上的标准,让您和阅读您代码的其他人的生活更轻松。