2012-06-14 12 views
17

voy a hacer una pregunta que se le ha pedido en very abstracta terms, con (comprensiblemente) no hay respuestas concretas previstas:¿Cómo lleno una tabla MySQL con muchos números aleatorios?

Desde el indicador de MySQL, ¿cómo crear y rellenar una tabla, rand_numbers, con una columna, number INT, y 1111 filas, donde la columna number tiene un número aleatorio entre 2222 y 5555?

Algo así como:

CREATE TABLE rand_numbers(number INT); 

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

Esta pregunta se ha hecho, pero de cualquier reliesexternal en idiomas para el bucle o es far too general. Me gustaría saber si es posible hacer algo tan simple a partir de un típico aviso de MySQL de Linux.

+0

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

+0

El segundo enlace que tiene (el "externo") está utilizando un procedimiento de SQL. Puede definirlo y ejecutarlo desde el prompt simplemente bien. –

Respuesta

27

Para crear el servicio de mesa:

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

continuación para poblar con valores aleatorios, se puede definir un stored procedure (que admite bucle):

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

A continuación, puede volver a utilizar este procedimiento para inserte más valores aleatorios basados ​​en diferentes parámetros ... digamos 600 filas con valores aleatorios entre 1200 y 8500:

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

Entonces, básicamente, ¿no es posible llenar una columna con números aleatorios en una consulta? Sin PROCEDIMIENTO u otro hacking – Green

+0

Respuestas mucho más simples a continuación, con una sola expresión ... – pgr

24

Sin crear un procedimiento almacenado, una técnica que he aplicado es utilizar la tabla para agregar las columnas. Primera semilla con un valor ...

A continuación, inserte de nuevo, seleccionando de esta tabla para duplicar las filas cada vez ...

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

que no es necesario para ejecutar la segunda consulta muchas veces para obtener bastantes filas aleatorias. No es tan "limpio" como usar un procedimiento almacenado, por supuesto, solo propone una alternativa.

Según lo señalado por mohamed23gharbi, puede encontrar duplicados si su masa de prueba es demasiado grande. Puede usar INSERT IGNORE para omitir duplicados si eso es un problema.

+1

esto fue sorprendentemente útil, y rápido, tomó menos de un minuto en la cli para agregar 2 millones de registros. exponencial ftw –

+1

consejo muy útil e inteligente: basado en la evolución exponencial del número de filas, pero algunas veces se cayó en un duplicado cuando se llega a un mayor número de inserciones – Mohamed23gharbi

+1

@ Mohamed23gharbi mejor uso 'INSERTAR IGNORE' para omitir duplicados. – Mindwin

1

siempre he utilizado este -

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; 

inserciones 1.000 números aleatorios. Las tablas sobre la marcha t1, t2, t3 tienen uniones cruzadas, por lo que obtenemos 10x10x10 filas.

Por lo tanto, para un millón de filas, solo agregue 3 más de (select 0 as i union select 1 ...) as declaraciones. Esto me parece conveniente, ya que no hay mucho esfuerzo para copiar y pegar algunas líneas un montón de veces.

Espero que esto ayude,

6

La tarea se puede hacer también de esta manera:

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

También puede utilizar la función matemática como BAJA(), ceil(), etc., en la expresión ..

+0

¿Qué significa 'WHERE 1'? – Green

+1

Esto realmente funciona. Esto es mucho más simple y mejor que la respuesta aceptada con algo de 'procedimiento 'largo. – Green

+0

@Green La actualización afecta a todas las filas que alcanzan la condición en 'WHERE', luego como 'WHERE 1' significa verdadero todas las filas se verán afectadas. –