Как вставить 1 миллион случайных строк в таблицу базы данных Oracle

Я не могу понять, как поставить огромное количество данных в таблице. Данные не должны повторяться

посоветуйте, может есть другие способы?

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; 

2 ответов


Если вы просто хотите количество данных и не заботитесь о случайности содержимого,

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

следует сделать трюк.


вы можете использовать исключение, чтобы игнорировать дубликаты и продолжать вставку, пока не появится миллион новых строк.

этот метод будет очень медленным. Если вам нужно сделать это несколько раз или для больших объемов данных, вы, вероятно, захотите ослабить свое определение "случайного" и использовать решение, подобное 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