29

私は非常に抽象的な言葉で尋ねられた質問をするつもりです.(当然のことながら)具体的な答えは提供されていません:

MySQL プロンプトから、 2222 ~ 5555 の間の乱数を保持するrand_numbers1 つの列number INTと 1111 行のテーブル を作成して入力するにはどうすればよいですか?number

何かのようなもの:

CREATE TABLE rand_numbers(number INT);

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

この質問は尋ねられましたが、ループの外部言語に依存しているか、一般的すぎます。典型的な Linux MySQL プロンプトからこれほど簡単なことを実行できるかどうか知りたいです。

4

5 に答える 5

36

ストアド プロシージャを作成せずに、私が適用した手法の 1 つは、テーブル自体を使用して列を追加することです。最初に値をシードします...

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

次に、このテーブルから選択して、毎回行を2倍にして、もう一度挿入します...

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

かなりの数のランダムな行を取得するために、2 番目のクエリを何度も実行する必要はありません。もちろん、ストアドプロシージャを使用するほど「きれい」ではなく、代替案を提案するだけです。

mohamed23gharbiで指摘されているように、テスト質量が大きすぎると重複する可能性があります。INSERT IGNORE問題がある場合は、重複をスキップするために使用できます。

于 2014-04-10T12:52:03.967 に答える
19

このタスクは、次の方法でも実行できます。

-- 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() などの数学関数を使用することもできます。

于 2015-05-14T08:09:12.780 に答える
2

私はいつもこれを使ってきました -

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 行になります。

したがって、100 万行程度の場合は、さらに 3 つの (select 0 as i union select 1 ...) asステートメントを追加するだけです。数行を何度もコピーして貼り付ける手間がかからないので、これは私には便利に思えます。

お役に立てれば、

于 2014-11-08T08:37:50.673 に答える