Как заполнить таблицу MySQL множеством случайных чисел? - программирование
Подтвердить что ты не робот

Как заполнить таблицу MySQL множеством случайных чисел?

Я задам вопрос, который был задан в очень абстрактных условиях, с ( понятно) нет конкретных ответов:

В командной строке MySQL, как мне создать и заполнить таблицу, rand_numbers, с одним столбцом, number INT и 1111 строками, где столбец number содержит случайное число между 2222 и 5555?

Что-то вроде:

CREATE TABLE rand_numbers(number INT);

 #run following line 1111 times
INSERT INTO rand_numbers (number) VALUES (2222 + CEIL( RAND() * 3333));

Этот вопрос задан, но полагается на внешние языки для цикла или слишком общий. Я хотел бы знать, возможно ли сделать что-то подобное из типичного запроса Linux MySQL.

4b9b3361

Ответ 1

Чтобы создать таблицу, используйте:

CREATE TABLE rand_numbers (
    number INT NOT NULL
) ENGINE = MYISAM;

Затем, чтобы заполнить его случайными значениями, вы можете определить хранимую процедуру (которая поддерживает цикл):

DELIMITER $$
CREATE PROCEDURE InsertRand(IN NumRows INT, IN MinVal INT, IN MaxVal INT)
    BEGIN
        DECLARE i INT;
        SET i = 1;
        START TRANSACTION;
        WHILE i <= NumRows DO
            INSERT INTO rand_numbers VALUES (MinVal + CEIL(RAND() * (MaxVal - MinVal)));
            SET i = i + 1;
        END WHILE;
        COMMIT;
    END$$
DELIMITER ;

CALL InsertRand(1111, 2222, 5555);

Затем вы можете повторно использовать эту процедуру для вставки более случайных значений на основе разных параметров.. скажем, 600 строк со случайными значениями между 1200 и 8500:

CALL InsertRand(600, 1200, 8500);

Ответ 2

Без создания хранимой процедуры один метод, который я применил, - это использовать таблицу для добавления столбцов. Сначала залейте его значением...

INSERT INTO rand_numbers ( number ) VALUES ( rand() * 3333 );

Затем вставьте снова, выбирая из этой таблицы, чтобы удваивать строки каждый раз...

INSERT INTO rand_numbers ( number ) SELECT number * rand() FROM rand_numbers; 

Вам не нужно многократно запускать второй запрос, чтобы получить довольно много случайных строк. Не как "аккуратный", как использование хранимой процедуры, конечно, просто предлагая альтернативу.

Как указано mohamed23gharbi, вы можете использовать дубликаты, если ваша тестовая масса слишком велика. Вы можете использовать INSERT IGNORE, чтобы пропустить дубликаты, если это проблема.

Ответ 3

Задача также может быть выполнена следующим образом:

-- scale from 0 to MAX

UPDATE `table` SET `column` = 1000 * RAND() WHERE 1;

-- scale from MIN to MAX

UPDATE `table` SET `column` = MIN + (MAX - MIN) * RAND() WHERE 1;

Вы также можете использовать в выражении математическую функцию, такую ​​как FLOOR(), CEIL() и т.д.

Ответ 4

Я всегда использовал это -

insert into rand_numbers ( number ) select rand() from (
    select 0 as i
    union select 1 union select 2 union select 3
    union select 4 union select 5 union select 6
    union select 7 union select 8 union select 9
) as t1, (
    select 0 as i
    union select 1 union select 2 union select 3
    union select 4 union select 5 union select 6
    union select 7 union select 8 union select 9
) as t2, (
    select 0 as i
    union select 1 union select 2 union select 3
    union select 4 union select 5 union select 6
    union select 7 union select 8 union select 9
) as t3;

Вставляет 1000 случайных чисел. Таблицы "на лету" t1, t2, t3 пересекаются, поэтому мы получаем строки 10x10x10.

Итак, как миллион строк, просто добавьте еще 3 (select 0 as i union select 1 ...) as. Мне это кажется удобным, так как не так много усилий скопировать несколько строк несколько раз.

Надеюсь, что это поможет,