MySQL INSERT IGNORE에 해당하는 Oracle?
삽입하기 전에 중복 항목이 없는지 확인하도록 쿼리를 업데이트해야 합니다.MySQL에서는 INSERT IGNORE를 사용하여 중복 레코드가 발견되면 삽입을 건너뛸 수 있지만 Oracle에 대한 동등한 옵션을 찾을 수 없습니다.좋은 의견이라도 있나?
11g에 있는 경우 힌트 IGNORE_ROW_ON_DUPKEY_INDEX를 사용할 수 있습니다.
SQL> create table my_table(a number, constraint my_table_pk primary key (a));
Table created.
SQL> insert /*+ ignore_row_on_dupkey_index(my_table, my_table_pk) */
2 into my_table
3 select 1 from dual
4 union all
5 select 1 from dual;
1 row created.
MERGE 문을 확인하십시오.이것은 당신이 원하는 것을 해야 합니다 - 그것은.WHEN NOT MATCHED
이를 수행할 조항.
Oracle의 진정한 VALUES() 절에 대한 지원 부족에 대해 수행합니다. 고정된 값을 가진 단일 레코드에 대한 구문은 매우 서툴지만 다음과 같습니다.
MERGE INTO your_table yt
USING (
SELECT 42 as the_pk_value,
'some_value' as some_column
FROM dual
) t on (yt.pk = t.the_pke_value)
WHEN NOT MATCHED THEN
INSERT (pk, the_column)
VALUES (t.the_pk_value, t.some_column);
다른 접근 방식(예: 다른 테이블에서 대량 로드를 수행하는 경우)은 Oracle의 "오류 로깅" 기능을 사용하는 것입니다.이 문장은 다음과 같습니다.
INSERT INTO your_table (col1, col2, col3)
SELECT c1, c2, c3
FROM staging_table
LOG ERRORS INTO errlog ('some comment') REJECT LIMIT UNLIMITED;
나중에 오류가 발생한 모든 행을 테이블에서 사용할 수 있습니다.errlog
생성해야 합니다.errlog
를 사용하여 삽입을 실행하기 전에 수동으로 테이블(또는 선택한 이름)DBMS_ERRLOG.CREATE_ERROR_LOG
.
자세한 내용은 설명서 참조
시간을 절약하기 위해 삽입을 시도하고 피할 수 없는 오류를 무시할 수 있습니다.
begin
insert into table_a( col1, col2, col3 )
values ( 1, 2, 3 );
exception when dup_val_on_index then
null;
end;
/
이렇게 하면 중복 기본 키 또는 고유 키 제약 조건에 의해 특별히 제기된 예외만 무시되며, 다른 모든 항목은 정상적으로 상승됩니다.
이 작업을 수행하지 않으려면 먼저 표에서 선택해야 합니다. 이 작업은 그다지 효율적이지 않습니다.
또 다른 변종
Insert into my_table (student_id, group_id)
select distinct p.studentid, g.groupid
from person p, group g
where NOT EXISTS (select 1
from my_table a
where a.student_id = p.studentid
and a.group_id = g.groupid)
아니면 당신이 할 수 있습니다.
Insert into my_table (student_id, group_id)
select distinct p.studentid, g.groupid
from person p, group g
MINUS
select student_id, group_id
from my_table
간단한 해결책
insert into t1
select from t2
where not exists
(select 1 from t1 where t1.id= t2.id)
이것은 내 것이 아니지만, 스클로더를 사용할 때 매우 유용하게 사용되었습니다.
테이블을 가리키는 보기를 만듭니다.
CREATE OR REPLACE VIEW test_view AS SELECT * FROM test_tab
트리거 생성:
CREATE OR REPLACE TRIGGER test_trig INSTEAD OF INSERT ON test_view FOR EACH ROW BEGIN INSERT INTO test_tab VALUES (:NEW.id, :NEW.name); EXCEPTION WHEN DUP_VAL_ON_INDEX THEN NULL; END test_trig;
ctl 파일에서 대신 보기에 다음을 삽입합니다.
OPTIONS(ERRORS=0) LOAD DATA INFILE 'file_with_duplicates.csv' INTO TABLE test_view FIELDS TERMINATED BY ',' (id, field1)
중복을 확인해야 하는 필드가 있는 인덱스를 추가하고 고유해야 한다고 말하는 것은 어떻습니까?읽기 검사를 저장합니다.
또 다른 "존재하지 않는 곳"-이중...
insert into t1(id, unique_name)
select t1_seq.nextval, 'Franz-Xaver' from dual
where not exists (select 1 from t1 where unique_name = 'Franz-Xaver');
언급URL : https://stackoverflow.com/questions/9332360/oracle-equivalent-to-mysql-insert-ignore
'programing' 카테고리의 다른 글
__del__ 메서드는 무엇이며 어떻게 부르나요? (0) | 2023.06.21 |
---|---|
Git에 의해 마스터에서 커밋되지 않은 변경 사항을 새 분기에 넣는 중 (0) | 2023.06.21 |
superclass __init_ 메서드가 자동으로 호출되지 않는 이유는 무엇입니까? (0) | 2023.06.21 |
Oracle - 업데이트 가입 - 키가 보존되지 않은 테이블 (0) | 2023.06.21 |
롤업 구성 파일에서 유형 스크립트를 지원합니까? (0) | 2023.06.21 |