MySql обновление.разница между результатами процедуры и phpmyadmin sql - PullRequest
0 голосов
/ 10 сентября 2018

У меня проблемы с получением процедуры обновления таблицы так, как мне нужно.Я использую phpmyadmin на моем локальном компьютере.В phpmyadmin я могу поместить следующий код на вкладку SQL, и будет обновлена ​​одна строка:

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

Как и ожидалось, если имя начинается с магии, а idKey равен '2016fulham02345', ТОГОобновлено до 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

Когда я запускаю эту процедуру, она обновляет ALL adjCost, где idKey= idk и (кажется) игнорирует параметр имени.

Сначала я попытался объединить строку имени:

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.

1 Ответ

0 голосов
/ 10 сентября 2018

Я не совсем уверен, что или как ты сделал, но вот что я сделал, и это мгновенно сработало. Поскольку вы не указали версию MySQL, я использовал 5.7.

РЕДАКТИРОВАТЬ: Теперь, когда я вернулся, чтобы увидеть ваше утверждение создания процедуры, я понял, что NO SQL был введен в MySQL 8.0. Поскольку ваша процедура явно 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 в верхнем регистре (что вы и сделали). Это своего рода стандарт де-факто и облегчает жизнь как вам, так и другим людям, читающим ваш код.

...