Вы спрашиваете, что вы делаете неправильно. Как сказано в руководстве MySQL: «В настоящее время вы не можете обновить таблицу и выбрать одну и ту же таблицу в подзапросе». Это означает, что вы не можете сделать что-то вроде
update my_table set random = (select min(my_field) from r);
, где вы делаете полный выбор как часть обновления.
Тем не менее, вы можете использовать select без ошибок, как вы нашли, но результаты не соответствуют вашим ожиданиям - область действия оператора SELECT в том виде, в котором вы его использовали, - это просто строка, над которой работали в данный момент. Вы можете проверить это, создав поле с именем num
и выполнив следующее:
update my_table set random = (select count(*));
Вы увидите, что для random задано значение 1 для каждой строки, поскольку селектор просматривает только одну строку, которую вы обновляете в этот момент.
Решение состоит в том, чтобы вычислить количество строк, сохранить его в переменной и сослаться на эту переменную в другом операторе.
SET @row_count = count(*) from my_table;
UPDATE my_table SET random = FLOOR(@cnt * RAND()) + 1;