반응형
Oracle 'INSERT ALL'에서 중복 무시
고유한 제약 조건이 있는 데이터베이스 테이블이 있습니다(유일).(DADSNBR, DAROLEID)
쌍). 이 테이블에 여러 값을 동시에 삽입할 예정이므로 하나의 쿼리를 사용하여 완료하고 싶습니다. 이것이 더 빠른 방법일 것이라고 가정합니다.제 질문은 다음과 같습니다.
INSERT ALL
INTO ACCESS (DADSNBR, DAROLEID) VALUES (68, 1)
INTO ACCESS (DADSNBR, DAROLEID) VALUES (68, 2)
INTO ACCESS (DADSNBR, DAROLEID) VALUES (68, 3)
INTO ACCESS (DADSNBR, DAROLEID) VALUES (68, 4)
SELECT 1 FROM DUAL
문 안에 이미 데이터베이스에 있는 항목과 중복되는 항목이 있으므로 전체 삽입이 실패하고 행이 삽입되지 않습니다.
고유한 제약 조건이 실패하는 경우를 무시하고 개별 INSERT 문으로 분할하지 않고 고유한 제약 조건만 삽입할 수 있는 방법이 있습니까?
편집: 어차피 나는 이것을 하고 싶지 않다는 것을 깨달았지만, 나는 그것이 가능한지 아닌지 여전히 궁금합니다.
오라클에서 문장은 완전히 성공하거나 완전히 실패합니다(원자적입니다).그러나 오류를 발생시키는 대신 로그 예외에 특정한 경우에 절을 추가할 수 있습니다.
두 번째 방법은 모두 자동이며, 데모는 다음과 같습니다(11gR2 사용).
SQL> CREATE TABLE test (pk1 NUMBER,
2 pk2 NUMBER,
3 CONSTRAINT pk_test PRIMARY KEY (pk1, pk2));
Table created.
SQL> /* Statement fails because of duplicate */
SQL> INSERT into test (SELECT 1, 1 FROM dual CONNECT BY LEVEL <= 2);
ERROR at line 1:
ORA-00001: unique constraint (VNZ.PK_TEST) violated
SQL> BEGIN dbms_errlog.create_error_log('TEST'); END;
2 /
PL/SQL procedure successfully completed.
SQL> /* Statement succeeds and the error will be logged */
SQL> INSERT into test (SELECT 1, 1 FROM dual CONNECT BY LEVEL <= 2)
2 LOG ERRORS REJECT LIMIT UNLIMITED;
1 row(s) inserted.
SQL> select ORA_ERR_MESG$, pk1, pk2 from err$_test;
ORA_ERR_MESG$ PK1 PK2
--------------------------------------------------- --- ---
ORA-00001: unique constraint (VNZ.PK_TEST) violated 1 1
사용할 수 있습니다.LOG ERROR
의 조항.INSERT ALL
(고마워 @알렉스 풀) 하지만 각 테이블 뒤에 조항을 추가해야 합니다.
SQL> INSERT ALL
2 INTO test VALUES (1, 1) LOG ERRORS REJECT LIMIT UNLIMITED
3 INTO test VALUES (1, 1) LOG ERRORS REJECT LIMIT UNLIMITED
4 (SELECT * FROM dual);
0 row(s) inserted.
MERGE 문을 사용하여 이 상황을 처리합니다.
merge into "ACCESS" a
using
(
select 68 as DADSNBR,1 as DAROLEID from dual union all
select 68,2 from dual union all
select 68,3 from dual union all
select 68,4 from dual
) t
on (t.DADSNBR = a.DADSNBR and t.DAROLEID = a.DAROLEID)
when not matched then
insert (DADSNBR, DAROLEID)
values (t.DADSNBR, t.DAROLEID);
언급URL : https://stackoverflow.com/questions/13420461/oracle-insert-all-ignore-duplicates
반응형
'programing' 카테고리의 다른 글
mySQL에서 SQL Server 함수 SCOPE_IDENTITY()의 등가? (0) | 2023.09.19 |
---|---|
gcc의 -m32 옵션은 언제 사용해야 합니까? (0) | 2023.09.19 |
워드프레스 포스트 메타에 행을 열로 선택 (0) | 2023.09.19 |
엔티티 프레임워크와 함께 저장 프로시저를 호출하는 방법? (0) | 2023.09.19 |
PowerShell 프로세스의 프로세스 ID 가져오기 (0) | 2023.09.19 |