2012-06-14 24 views
17

Tôi sẽ đặt một câu hỏi đã được hỏi trong very trừu tượng terms, với (dễ hiểu) không có câu trả lời cụ thể được cung cấp:Làm cách nào để điền một bảng MySQL với nhiều số ngẫu nhiên?

Từ dấu nhắc MySQL, làm thế nào tôi có thể tạo và cư một bảng, rand_numbers, với một , number INT và 1111 hàng, trong đó cột number có số ngẫu nhiên trong khoảng từ 2222 đến 5555?

Cái gì như:

CREATE TABLE rand_numbers(number INT); 

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

Câu hỏi này đã được yêu cầu, nhưng một trong hai relies trên external ngôn ngữ cho các vòng lặp hoặc là far too general. Tôi muốn biết nếu nó có thể làm điều gì đó đơn giản này từ một dấu nhắc Linux MySQL điển hình.

+0

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

+0

Liên kết thứ hai mà bạn có ("bên ngoài") đang sử dụng quy trình SQL. Bạn có thể xác định và chạy nó từ dấu nhắc tốt. –

Trả lời

27

Để tạo việc sử dụng bảng:

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

Sau đó để cư nó với các giá trị ngẫu nhiên, bạn có thể định nghĩa một stored procedure (hỗ trợ vòng lặp):

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

Sau đó, bạn có thể sử dụng lại thủ tục để chèn thêm các giá trị ngẫu nhiên dựa trên các thông số khác nhau .. nói 600 hàng có giá trị ngẫu nhiên giữa 1200 và 8500:

CALL InsertRand(600, 1200, 8500); 
+0

Vì vậy, về cơ bản không thể điền một cột với số ngẫu nhiên trong một truy vấn? W/o 'PROCEDURE' hoặc hack khác – Green

+0

Nhiều câu trả lời đơn giản hơn bên dưới, với một biểu thức duy nhất ... – pgr

24

Nếu không tạo quy trình được lưu trữ, một kỹ thuật tôi đã áp dụng là sử dụng chính bảng đó để thêm các cột. hạt giống đầu tiên nó với một giá trị ...

Sau đó chèn một lần nữa, chọn từ bảng này sẽ tăng gấp đôi các hàng mỗi lần ...

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

Bạn không cần phải chạy truy vấn thứ hai nhiều lần để có được một vài hàng ngẫu nhiên. Không phải là "gọn gàng" như sử dụng một thủ tục lưu trữ tất nhiên, chỉ đề xuất một thay thế.

Như được chỉ ra bởi mohamed23gharbi, bạn có thể chạy vào các bản sao nếu khối lượng thử nghiệm của bạn quá lớn. Bạn có thể sử dụng INSERT IGNORE để bỏ qua các bản sao nếu đó là sự cố.

+1

điều này thật đáng ngạc nhiên - và nhanh chóng - mất ít hơn một phút trên cli để thêm 2 triệu bản ghi. exponential ftw –

+1

mẹo rất hữu ích và thông minh: dựa trên sự tiến hóa theo cấp số nhân của số hàng, nhưng đôi khi bạn rơi vào một bản sao khi bạn đạt số lượng lớn hơn chèn – Mohamed23gharbi

+1

@ Mohamed23gharbi sử dụng tốt hơn 'INSERT IGNORE' để bỏ qua các bản sao. – Mindwin

1

Tôi đã luôn luôn sử dụng này -

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; 

Chèn 1000 số ngẫu nhiên. Các bảng có sẵn t1, t2, t3 được kết hợp chéo để chúng tôi nhận được các hàng 10x10x10.

Vì vậy, đối với hàng triệu hàng, chỉ cần thêm 3 câu lệnh (select 0 as i union select 1 ...) as. Điều này có vẻ thuận tiện với tôi, vì không có nhiều nỗ lực sao chép-dán một vài dòng một loạt các lần.

Hope this helps,

6

Nhiệm vụ có thể được thực hiện cũng theo cách này:

-- 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; 

Bạn cũng có thể sử dụng chức năng toán học như FLOOR(), ceil(), vv trong các biểu hiện ..

+0

'WHERE 1' có nghĩa là gì? – Green

+1

Điều này thực sự hiệu quả. Điều này đơn giản hơn và tốt hơn câu trả lời được chấp nhận với điều 'thủ tục' dài. – Green

+0

@Green Bản cập nhật ảnh hưởng đến tất cả các hàng đạt được điều kiện trong 'WHERE', sau đó là' WHERE 1' có nghĩa là tất cả các hàng sẽ bị ảnh hưởng. –

Các vấn đề liên quan