2012-06-14 19 views
17

我要問的是已經被問very抽象terms一個問題,用(理解)沒有提供具體的答案:如何填充許多隨機數的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)); 

這個問題已經被問過,但無論是reliesexternal語言的循環或者是far too general。我想知道是否可以從典型的Linux MySQL提示符中執行一些簡單的操作。

+0

http://dev.mysql.com/doc/refman/5.0/en/loop-statement.html –

+0

您擁有的第二個鏈接(「外部」鏈接)正在使用SQL過程。您可以從提示中定義並運行它。 –

回答

27

要創建表使用:

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

然後用隨機值來填充它,你可以定義一個stored procedure(支持循環):

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); 
+0

所以基本上不可能在一個查詢中填充隨機數字的列? W/o'PROCEDURE'或其他黑客 – Green

+0

下面的答案簡單得多,只有一個表達式...... – pgr

24

而無需創建一個存儲過程,一個技術我申請是使用表本身添加的列。用一個值第一種子吧...

然後重新插入,從這個表中選擇每次行翻一番......

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

你並不需要運行第二個查詢多次獲得相當多的隨機行。當然不像使用存儲過程那樣「簡潔」,只是提出一個替代方案。

正如mohamed23gharbi指出的那樣,你可以,如果你的測試質量過大碰上重複。您可以使用INSERT IGNORE跳過重複,如果這是一個問題。

+1

這對於添加200萬條記錄的cli需要不到一分鐘的時間。指數ftw –

+1

非常有用和巧妙的提示: 基於行數的指數演化,但有些時候,當你達到更大數量的插入時,你會落在重複的地方 – Mohamed23gharbi

+1

@ Mohamed23gharbi更好地使用'INSERT IGNORE'來跳過重複。 – Mindwin

1

我一直用這個 -

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的隨機數。在即時表t1t2t3是交叉連接,所以我們得到10x10x10行。

因此,對於一百萬行,只需添加3個以上的 (select 0 as i union select 1 ...) as陳述。這對我來說似乎很方便,因爲沒有太多的努力複製粘貼幾行。

希望這有助於

6

任務也可以做這樣的:

-- 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()等在表達..

+0

WHERE 1是什麼意思? – Green

+1

這確實有效。這比用''procedure''做的事情更容易,更好。 – Green

+0

@Green更新影響所有在WHERE中實現條件的行,然後作爲WHERE 1意味着所有的行都會受到影響。 –