2012-07-31 35 views
9

Tôi không thể tìm ra cách để đặt một lượng lớn dữ liệu trong bảng. Dữ liệu không được lặp lạiCách chèn 1 triệu hàng ngẫu nhiên vào bảng cơ sở dữ liệu Oracle

Tư vấn, có thể có các cách khác?

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

Bạn nên *** không *** tạo bảng trong tài khoản SYSTEM' '(và bạn không nên * việc * với tài khoản SYSTEM trừ khi công việc DBA làm của bạn) –

+0

đây là ví dụ, nhưng nhờ cho lời khuyên –

Trả lời

24

Nếu bạn chỉ muốn số lượng dữ liệu và không quan tâm về tính ngẫu nhiên của các nội dung,

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

nên làm các trick.

+0

Trong thực tế của vấn đề. Tất cả dữ liệu phải là ngẫu nhiên và không thể lặp lại –

+0

Không có sự lặp lại trong giải pháp này. Mỗi giá trị sẽ là duy nhất và do đó sẽ phù hợp với mô hình dữ liệu của bạn. Bạn không thể sử dụng DBMS_RANDOM để tạo khóa chính. – APC

+2

Nếu bạn muốn nó ngẫu nhiên hơn, bạn có thể ghép nối 'rownum' (chắc chắn là duy nhất) với một chuỗi ngẫu nhiên từ' dbms_random'. –

6

Bạn có thể sử dụng ngoại lệ để bỏ qua các từ khóa trùng lặp và tiếp tục chèn cho đến khi có hàng triệu hàng mới.

Phương pháp này sẽ rất chậm. Nếu bạn cần phải làm điều này nhiều lần, hoặc cho số lượng lớn dữ liệu, bạn có thể sẽ muốn thư giãn định nghĩa của bạn "ngẫu nhiên" và sử dụng một giải pháp như ammoQ's.

--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 
Các vấn đề liên quan