Я вижу несколько проблем:
Во-первых, слово index зарезервировано, поэтому в вашей функции вы должны использовать index
.
Во-вторых, в предоставленном операторе обновления ваше предложение WHERE должно быть id_ = 1
, а не id = 1
. Я воссоздал вашу таблицу и функцию, используя следующий код:
DELIMITER $$
DROP FUNCTION IF EXISTS `test`.`fn_get_max`$$
CREATE DEFINER=`root`@`localhost` FUNCTION `fn_get_max2`( _id INT,
_index VARCHAR( 30 )) RETURNS INT(11)
BEGIN
DECLARE r INT;
SELECT MAX(value1 )
INTO r
FROM test_table
WHERE id_ = _id
AND `INDEX` = _index;
RETURN r;
END$$
DELIMITER ;
Затем, используя следующий оператор обновления, корректно обновляет max_idval.
UPDATE test_table SET max_idval = fn_get_max2('1','abc') WHERE id_ = '1'
Если это однократное обновление, вы можете сделать это более эффективно с временной таблицей (поскольку MySQL не позволяет таблицам объединяться в запросе на обновление):
CREATE TEMPORARY TABLE tmp (id_ INT, maxvalue1 INT);
INSERT INTO tmp (id_, maxvalue1)
SELECT id_, MAX(Value1) AS max_value1
FROM test_table
GROUP BY id_;
UPDATE test_table, tmp SET test_table.Max_idVal = tmp.maxvalue1
WHERE test_table.id_ = tmp.id_
Это должно корректно обновить все строки.