2011-12-03 37 views
8

Tôi đang cố gắng chèn 40 hàng bằng INSERT ALL INTO và tôi không chắc chắn về cách chèn khóa thay thế. Dưới đây là những gì tôi cóINSERT ALL INTO và Sequence.nextval cho khóa thay thế

BEGIN 
    INSERT ALL 

    INTO question(question_id) 
    VALUES (question_seq.nextval) 
END 

Bây giờ nếu tôi thêm một giá trị INTO khác thì tôi sẽ bị vi phạm ràng buộc duy nhất.

BEGIN 
    INSERT ALL 

    INTO question(question_id) 
    VALUES (question_seq.nextval) 

    INTO question(question_id) 
    VALUES (question_seq.nextval) 
END 

Làm cách nào để cập nhật giá trị chuỗi tiếp theo cho mỗi INTO VALUES để tôi có thể tránh vi phạm ràng buộc duy nhất? Tôi giả định rằng nextval sẽ tự động cập nhật chính nó.

CẬP NHẬT: Tôi không biết nếu điều này là cách tốt nhất để xử lý này nhưng đây là giải pháp tôi đến với:

đầu tiên tôi tạo ra một hàm trả về một giá trị sau đó tôi gọi là hàm trong lĩnh vực id của mệnh đề VALUES

create or replace 
FUNCTION GET_QUESTION_ID RETURN NUMBER AS 
num NUMBER; 
BEGIN 
    SELECT UHCL_QUESTIONS_SEQ.nextval 
    INTO num 
    FROM dual; 
    return num; 
END GET_QUESTION_ID; 

INSERT ALL 
INTO question(question_id) 
VALUES (GET_QUESTION_ID()) 
INTO question(question_id) 
VALUES (GET_QUESTION_ID()) 
+1

Bạn không cần mệnh đề 'from' với' chèn tất cả'? – Raihan

+0

@Raihan không phải để chèn tất cả. – Robert

+0

@Raihan xin lỗi về điều đó ... bạn nói đúng, tôi chỉ không dán lựa chọn vào, nhưng tôi có một. – Robert

Trả lời

0

Bạn có thể sử dụng một cái gì đó như thế này:

insert into question(question_id) 
select question_seq.nextval from 
(
    select level from dual connect by level <= 40 
); 

Mặc dù nó không phải là một định dạng rất thuận tiện, đặc biệt là nếu có các cột khác bạn muốn thêm. Có thể bạn cần phải tạo một truy vấn UNION ALL khác và tham gia theo số LEVEL hoặc ROWNUM.

Suy nghĩ đầu tiên của tôi là phải làm một cái gì đó như thế này:

insert into question(question_id) 
select question_seq.nextval value from dual 
union all 
select question_seq.nextval from dual; 

Nhưng nó tạo ORA-02287: sequence number not allowed here, do restrictions on sequence values.


Nhân tiện, bạn có chắc là INSERT ALL hoạt động mà không có truy vấn con không? Tôi nhận được lỗi ORA-00928: missing SELECT keyword, và sơ đồ từ 11,2 manual ngụ ý phải có một subquery:

enter image description here

0

tôi không biết nếu điều này là cách tốt nhất để xử lý này nhưng đây là giải pháp tôi đến với:

đầu tiên tôi tạo ra một hàm trả về giá trị sau đó tôi gọi là chức năng trong lĩnh vực id của mệnh đề VALUES

create or replace 
FUNCTION GET_QUESTION_ID RETURN NUMBER AS 
num NUMBER; 
BEGIN 
    SELECT UHCL_QUESTIONS_SEQ.nextval 
    INTO num 
    FROM dual; 
    return num; 
END GET_QUESTION_ID; 

INSERT ALL 
INTO question(question_id) 
VALUES (GET_QUESTION_ID()) 
INTO question(question_id) 
VALUES (GET_QUESTION_ID()) 
1

Là từ một nền tảng SQL Server, tôi đã luôn luôn tạo ra một kích hoạt trên bảng để về cơ bản thi đua SẮC chức năng. Khi trình kích hoạt được bật, SK sẽ tự động được tạo từ chuỗi giống như danh tính và bạn không phải lo lắng về nó.

Các vấn đề liên quan