2012-07-31 37 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 
相关问题