2012-07-31 35 views
9

No puedo encontrar la manera de poner una gran cantidad de datos en la tabla. Los datos no deben repetirseCómo insertar 1 millón de filas al azar en la base de datos de tablas Oracle

¿Aconseja, puede tener otras formas?

create table COUNTRIES (
    COUNTRY_ID VARCHAR2(7), 
    COUNTRY_NAME VARCHAR2(40), 
    constraint COUNTRY_C_ID_PK primary key (COUNTRY_ID) 
); 


Begin 
For IDS in 1..1000000 
Loop 
INSERT INTO "SYSTEM"."COUNTRIES" (COUNTRY_ID, COUNTRY_NAME) VALUES (dbms_random.string('L', 7), dbms_random.string('L', 15)); 
Commit; 
End loop; 
End; 
+9

Usted debe *** *** no crear tablas en la cuenta 'SYSTEM' (y usted no debe * * trabajo con la cuenta del sistema a menos que su trabajo DBA haciendo) –

+0

se trata ejemplo, pero gracias por la consejo –

Respuesta

24

Si lo que desea es la cantidad de datos y no se preocupan por la aleatoriedad de los contenidos,

insert into countries select rownum, 'Name'||rownum from dual 
    connect by rownum<=1000000; 

debe hacer el truco.

+0

De hecho, del problema. Todos los datos deben ser aleatorios y no se pueden repetir –

+0

No hay repetición en esta solución. Cada valor será único y, por lo tanto, se ajustará a su modelo de datos. No puede usar DBMS_RANDOM para generar una clave principal. – APC

+2

Si lo quiere más aleatorio, puede concatenar 'rownum' (definitivamente único) con una cadena aleatoria de' dbms_random'. –

6

Puede usar una excepción para ignorar duplicados y continuar insertando hasta que haya un millón de filas nuevas.

Este método será muy lento. Si necesita hacer esto varias veces, o para cantidades más grandes de datos, probablemente quiera relajar su definición de "aleatorio" y usar una solución como ammoQ.

--Create temporary unique constraint. (Assuming you want each column to be unique?) 
alter table countries add constraint countries_name_uq unique (country_name); 

--Insert random data until it worked 1 million times. 
Declare 
    rows_inserted number := 0; 
Begin 
    Loop 
     Begin 
      INSERT INTO COUNTRIES(COUNTRY_ID, COUNTRY_NAME) 
      VALUES(dbms_random.string('L', 7), dbms_random.string('L', 15)); 
      --Only increment counter when no duplicate exception 
      rows_inserted := rows_inserted + 1; 
     Exception When DUP_VAL_ON_INDEX Then Null; 
     End; 
     exit when rows_inserted = 1000000; 
    End loop; 
    commit; 
End; 
/

--Drop the temporary constraint 
alter table countries drop constraint countries_name_uq; 

--Double-check the count of distinct rows 
select count(*) from 
(
    select distinct country_id, country_name from countries 
); 

Result 
------ 
1000000 
Cuestiones relacionadas