2012-07-31 141 views
9

我無法弄清楚如何將大量的數據放入表中。該數據不能重複如何向表數據庫中插入100萬個隨機行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; 
+9

你應該不*** ***在'SYSTEM'帳戶創建表(和你不應該*工作*系統帳戶,除非你做DBA的工作) – 2012-07-31 10:50:15

+0

這個例子,但感謝意見 – 2012-07-31 11:41:12

回答

24

如果你只是想的數據量和不關心內容的隨機性,

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

應該做的伎倆。

+0

事實上的問題。 所有數據必須是隨機的,不能重複 – 2012-07-31 11:39:01

+0

此解決方案中沒有重複。每個值都是唯一的,因此將適合您的數據模型。您不能使用DBMS_RANDOM來生成主鍵。 – APC 2012-07-31 12:54:03

+2

如果你想要更隨機,你可以將'rownum'(絕對唯一)和'dbms_random'中的一個隨機字符串連接起來。 – 2012-07-31 17:43:55

6

您可以使用例外來忽略重複項,並繼續插入,直到有一百萬個新行。

這種方法會很慢。如果您需要多次執行此操作,或者需要處理大量數據,您可能需要放寬「隨機」定義並使用像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