Вставка случайных чисел в таблицу в MYSQL - PullRequest
2 голосов
/ 14 марта 2012

Я пытаюсь подсчитать количество строк в таблице и сгенерировать случайные числа для поля 'random'. Теперь это работает:

SELECT COUNT(*) FROM my_table; 

и это работает:

   UPDATE my_table SET random = FLOOR(6500 * RAND()) + 1;

Но это не работает:

UPDATE my_table SET random = FLOOR((SELECT COUNT(*) ) * RAND()) + 1;

Но это считает строки как 0 и добавляет единицу, так что все поля имеют номер один вместо уникального случайного числа.

Любые идеи, что яделаю неправильно, было бы очень полезно.

Ответы [ 2 ]

8 голосов
/ 14 марта 2012

А как насчет этого?

SELECT @cnt := count(*) FROM my_table;
UPDATE my_table SET random = FLOOR(@cnt * RAND()) + 1;

Демо: http://sqlfiddle.com/#!2/a896d/4

0 голосов
/ 14 марта 2012

Вы спрашиваете, что вы делаете неправильно. Как сказано в руководстве 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...